Python进阶编程 类与类的关系
程序员文章站
2023-11-30 15:43:04
类与类的关系 依赖关系 组合关系 组合: 将一个类的对象封装成另一个类的对象的属性. 继承关系 继承的优点: 1,增加了类的耦合性(耦合性不宜多,宜精)。 2,减少了重复代码。 3,使得代码更加规范化,合理化 继承:可以分 单继承,多继承 。 单继承 第一种:直接执行 第二种:子类和父类都有相同功能 ......
类与类的关系
依赖关系
# 依赖关系: 将一个类的类名或者对象传给另一个类的方法中. class elephant: def __init__(self, name): self.name = name def open(self,r1): # print(ref1) print(f'{self.name}默念三声: 芝麻开门') r1.open_door() def close(self): print('大象默念三声:芝麻关门') class refrigerator: def __init__(self, name): self.name = name def open_door(self): print(f'{self.name}冰箱门被打开了....') def close_door(self): print('冰箱门被关上了....') e1=elephant('大象') r1=refrigerator('海尔冰箱') e1.open(r1) #将一个类的类名或者对象传给另一个类的方法中.产生了依赖关系
组合关系
组合: 将一个类的对象封装成另一个类的对象的属性.
class boy: def __init__(self, name): self.name = name def meet(self, girl_friend=none): self.girl_friend = girl_friend # wu对象空间 : girl_friend : object对象 def have_diner(self): # self = wu这个对象空间 if self.girl_friend: print(f'{self.name}请年龄为:{self.girl_friend.age},姓名为{self.girl_friend.name}一起吃六块钱的麻辣烫') self.girl_friend.shopping(self) # (self = wu对象空间) else: print('单身狗,吃什么吃') class girl: def __init__(self, name, age): self.name = name self.age = age def shopping(self,boy_friend): print(f'{boy_friend.name},{self.name}一起去购物!') wu = boy('吴超') flower = girl('如花', 48) # 组合: 将一个类的对象封装成另一个类的对象的属性. wu.meet(flower) wu.have_diner()
继承关系
继承的优点:
1,增加了类的耦合性(耦合性不宜多,宜精)。
2,减少了重复代码。
3,使得代码更加规范化,合理化
继承:可以分单继承,多继承。
单继承
第一种:直接执行
class aniaml(object): type_name = '动物类' def __init__(self,name,sex,age): self.name = name self.age = age self.sex = sex def eat(self): print(self) print('吃东西') class person(aniaml): pass p1=person('alex','男','18') # 实例化对象时必须执行__init__方法,类中没有,从父类找,父类没有,从object类中找 p1.eat() # 先要执行自己类中的eat方法,自己类没有才能执行父类中的方法。
第二种:子类和父类都有相同功能,都想执行
class aniaml(object): type_name = '动物类' def __init__(self,name,sex,age): self.name = name self.age = age self.sex = sex def eat(self): print('吃东西') class person(aniaml): def __init__(self,name,sex,age,mind): super().__init__(name,sex,age) # super.__init__ 自动帮你把self 传给父类的__init__ self.mind = mind def eat(self): super().eat() print('%s 吃饭'%self.name) p1 = person('春哥','laddboy',18,'有思想')
多继承
class a: pass class b(a): pass class c(a): pass class d(b, c): pass class e: pass class f(d, e): pass class g(f, d): pass class h: pass class foo(h, g): pass
新式类的多继承
mro是一个有序列表l,在类被创建时就计算出来。
通用计算公式为:
mro(child(base1,base2)) = [ child ] + merge( mro(base1), mro(base2), [ base1, base2] )(其中child继承自base1, base2)
如果继承至一个基类:class b(a)
这时b的mro序列为
mro( b ) = mro( b(a) ) = [b] + merge( mro(a) + [a] ) = [b] + merge( [a] + [a] ) = [b,a]
如果继承至多个基类:class b(a1, a2, a3 …)
这时b的mro序列
mro(b) = mro( b(a1, a2, a3 …) ) = [b] + merge( mro(a1), mro(a2), mro(a3) ..., [a1, a2, a3] ) = ...
计算结果为列表,列表中至少有一个元素即类自己,如上述示例[a1,a2,a3]。merge操作是c3算法的核心。
4.2.2. 表头和表尾
表头:
列表的第一个元素
表尾:
列表中表头以外的元素集合(可以为空)
示例
列表:[a, b, c]
表头是a,表尾是b和c
4.2.3. 列表之间的+操作
+操作:
[a] + [b] = [a, b]
(以下的计算中默认省略)
---------------------
merge操作示例:
如计算merge( [e,o], [c,e,f,o], [c] ) 有三个列表 : ① ② ③ 1 merge不为空,取出第一个列表列表①的表头e,进行判断 各个列表的表尾分别是[o], [e,f,o],e在这些表尾的集合中,因而跳过当前当前列表 2 取出列表②的表头c,进行判断 c不在各个列表的集合中,因而将c拿出到merge外,并从所有表头删除 merge( [e,o], [c,e,f,o], [c]) = [c] + merge( [e,o], [e,f,o] ) 3 进行下一次新的merge操作 ...... ---------------------
下一篇: Python 操作 MySQL 数据库