类与类的关系

Posted sandy-123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类与类的关系相关的知识,希望对你有一定的参考价值。

从类空间与对象空间的角度研究类

给对象封装属性:

1.在__init__中

2.在类的外部

3.在类的其他方法中

给一个类添加属性:

1.类的外部

2.类的内部

class A:
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def func(self,sex):
        self.sex = sex
    def func1(self):
        A.country = 中国

#给对象添加属性:
obj = A(barry,18)           #在__init__中添加属性
obj.height = 176              #在类的外面添加属性
obj.func()                #在类的方法中添加属性
print(obj.__dict__)

#给类添加属性:
A.count = 666                  #在类的外部
obj.func1()                    #在类的内部

 

类对象指针(对象空间):

对象找属性顺序:对象空间--类空间--父类空间

类指针(累空间):

类找属性顺序:类空间--父类空间

以上顺序单向不可逆

类与类的关系

1.依赖关系 :  将一个类的类名或者对象传入到另一个类的方法中

class Elephant:                                     #大象类
    def __init__(self,name):
        self.name = name
    def open(self,ref):
        print(%s打开冰箱门%(self.name))
        ref.beopen_door()
    def close(self,foo):
        print(%s关闭冰箱门%(self.name))
        foo.beclosed_door()

class Refrigerator:                                 #冰箱类
    def __init__(self,name):
        self.name = name
    def beopen_door(self):
        print(%s冰箱门被打开了%(self.name))
    def beclosed_door(self):
        print(%s冰箱门被关闭了%(self.name))
   
ele = Elephant(猛犸)                          #实例化大象对象

haier = Refrigerator(海尔)                    #实例化冰箱对象
ele.open(haier)                                 #将冰箱对象传入大象类的方法中
ele.close(haier)

# gree = Refrigerator(‘格力‘)
# ele.open(gree)
# ele.close(gree)

#大象是主体,可以选择冰箱,冰箱依赖于大象

 

2.组合(关联,聚合)关系 : 将一个类的对象或者类名封装到另一个类的对象的属性中

class Boy:
    def __init__(self,name,girlfriend=None):
        self.name = name
        self.girlfriend = girlfriend
    def dinner(self,ref):
        if self.girlfriend:
            print(%s和女朋友%s共进晚餐%(self.name,ref.name))
        else:
            print(今晚吃鸡,大吉大利)

class Girl:
    def __init__(self,name,boyfriend=None):
        self.name = name
        self.boyfriend = boyfriend
    def shopping(self,ref):
        if self.boyfriend:
            print(%s和男朋友%s一起逛街%(self.name,ref.name))
        else:
            print(宅在家)

# alex = Boy(‘alex‘)          #girlfiend 默认为None
# alex.dinner()

结果:
今晚吃鸡,大吉大利                #执行else条件下语句

# ruhua = Girl(‘如花‘)
# alex.girlfriend = ruhua        #将ruhua这个对象传给girlfriend
# alex.dinner()

结果:
alex和女朋友如花共进晚餐

# jinlian = Girl(‘金莲‘)
# wuda = Boy(‘武大‘,jinlian)       #将jinlian这个对象在一开始就传给girlfriend
# wuda.dinner()

结果:
武大和女朋友金莲共进晚餐

# wuda.girlfriend = None
# wuda.dinner()                    #解除绑定

结果:
今晚吃鸡,大吉大利


# alex = Boy(‘alex‘)
# ruhua = Girl(‘如花‘)
# ruhua.boyfriend = alex      #将alex这个对象传给boyfriend
# ruhua.shopping()

结果:
如花和男朋友alex一起逛街

 

3.继承(实现)关系 : 有父类和子类,子类可以继承调用父类的内容

继承的好处:

1.减少代码重复率

2.让类与类产生关系,增强耦合性

3.使代码更加规范化,清晰化

在python3中,所有的类都默认继承父类 object

单继承

class Animal:
    live = 活着
    def __init__(self,name,sex,age):
        self.name = name
        self.sex = sex
        self.age = age
    def eat(self):
        print(动物都会吃)

class Person(Animal):           #子类名(父类名)
    live = 无所谓


对象:
p1 = Person(alex,,20)      #子类中没有,执行父类中的__init__
p1.eat()                              #子类中没有,执行父类中的eat方法
print(p1.live)                       #子类和父类中具有相同的属性,先调用自己类中的属性

结果:
无所谓


#子类执行父类的属性和方法,也会将自己的地址传给self

类名:
Person.live      #自己类中有,调用自己类中的属性

结果:
无所谓

 

对象既要执行子类的方法,又要执行父类的方法:

1.在子类中写入 父类名.方法名(self,参数) 

class Animal:
    live = 活着
    def __init__(self,name,sex,age):
        self.name = name
        self.sex = sex
        self.age = age
    def eat(self):
        print(动物都会吃)

class Person(Animal):
    live = 无所谓
    def eat(self):
        Animal.eat(self)            #父类名.方法名(self),手动将p1对象传给self
        print(人类都需要吃饭)

 

2.在子类的方法中,写入 super().方法名(参数)  自动将子类的对象传入父类方法的self

class Animal:
    def __init__(self,name,sex,age):
        self.name = name
        self.sex = sex
        self.age = age
    def eat(self):
        print(动物都会吃)

class Person(Animal):
    def eat(self):
        super().eat()            #调用父类的eat方法,将p1对象自动传给父类eat方法中的self
        print(人类都需要吃饭)

p1 = Person(alex,,20)  #自动调用父类的__init__方法进行传参
p1.eat()

结果:
动物都会吃
人类都需要吃饭

 

在子类中封装另外的属性

1.使用类名   不依赖继承

class Animal:
    def __init__(self,name,sex,age):
        self.name = name
        self.sex = sex
        self.age = age

class Person(Animal):
    def __init__(self,n,s,a,mind):
        # Animal.__init__(self,n,s,a)    #方法一:不依赖继承  类名后可以不加Animal
        self.mind = mind

p1 = Person(邓哥,,18,思想)

 

 

2.super()    依赖继承

class Animal:
    def __init__(self,name,sex,age):
        self.name = name
        self.sex = sex
        self.age = ageclass Cat(Animal):
    def __init__(self,n,s,a,climb):
        super().__init__(n,s,a)          #方法二:依赖继承
        self.climb = climb

c1 = Cat(大橘,,4,爬树)

 



以上是关于类与类的关系的主要内容,如果未能解决你的问题,请参考以下文章

python 面向对象专题:类的空间问题类与对象之间的关系类与类之间的关系

Java 类与类的关联聚合继承实现关系

java中类与类之间的关系讲解

Python进阶编程 类与类的关系

python类与类的关系

UML描述面向对象程序设计中类与类的关系