"""
多继承和super的关系
"""
class Person:
def __init__(self, name, age):
print('Person类开始构造')
self.name = name
self.age = age
print('Person类end构造')
def love1(self):
print('混吃等饿...')
class Man(Person):
def __init__(self, love, *args, **kwargs, ):
self.love = love
print('Man类开始构造')
super(Man, self).__init__(*args, **kwargs)
print('Man类end构造')
def love1(self):
"""重写父类方法, 子类有新的实现"""
print('%s,%d,爱好是%s' % (self.name, self.age, self.love))
class WoMan(Person):
def __init__(self, *args, **kwargs):
print('WoMan类开始构造')
super(WoMan, self).__init__(*args, **kwargs)
# self.__love = love
print('WoMan类end构造')
def love1(self):
print('我爱好购物 剁手')
# print('%s,%d,爱好是%s' % (self.name, self.age, self.__love))
class Son(Man, WoMan):
"""多继承:一个子类有多个父类 java没有多继承,c++有"""
def __init__(self, *args, **kwargs):
print('Son类开始构造')
# 当前类的下一个类 -->Man super(Son, self).__init__()==Son.__init__()
super(Son, self).__init__(*args, **kwargs)
print('Son类end构造')
def love1(self):
print('%s,%d,爱好是%s' % (self.name, self.age, self.love))
if __name__ == '__main__':
# p = Man('王二麻子', 50, '抽烟喝酒')
# p.love()
# w = WoMan('如花',18,'搓麻将')
# w.love()
datou = Son(name='大头', age=10,love='上学')
datou.love1()
# print(Son.mro())
# print(Son.__mro__)
# <__main__.Person object at 0x0000026F4622A7F0> <>代表一个对象
# -----------------------------单继承------------------------->
"""
1.>单继承:
因为子类需要使用父类提供的属性 必须要调用父类__init__()构造父类的属性
2.>多继承<菱形继承也叫钻石继承>:
父类.__init__(self,参数)构造父类的属性,导致父类的属性被构造多次,造成语义的二义性
super关键字作用: 为了解决这个问题
3.>MRO方法解析:
特点:在这个顺序上,保证所有的类只初始化一次
作用:使用这个顺序将所有的类的__init__()方法全部调用一次,
解决了父类.__init__方式的问题
super关键字的本质:就是使用了MRO顺序
4.>查看MRO:
类.mro() -->[] 类方法返回 列表类型
类.__mro__ -->() 魔法方法返回元组类型
MRO顺序的特点:子类一定在父类的前面,同一级的兄弟类和子类的继承顺序有关系.
5.>super
super关键字的本质 ---> 使用了MRO顺序
super(参数1,参数2)在py3中两个参数可以省略,在py2两个参数不可以省略
参数1:是继承的类的对象
参数2:一般是self,当前类的实例对象,一般只能是self
py3中默认所有的类都是新式类<继承自object>
py2中如果没有写父类,该类是经典类,如果写了父类,该类就是新式类.<父类就是object>
super只能使用于新式类,经典类中不能使用super关键字
super不一定调的是父类哦,因为mro算法顺序的具体不一定.有可能是父类,也有可能是兄弟类
新式类:object的子类
禁止:将 类.__init__()和super().__init__()方法混用
"""
# def super(cls,self):
# return cls.mro[cls.find(cls) + 1]
# # super取出了当前类在mro顺序中的下一个类
"""
工作中:出现很多类的时候,使用UML 统一建模语言
类图,对象图,活动图,协作图
类属性可以被实例对象调用,反之则不行.类对象不可以调用实例属性.
"""