1、全量代码
class Master:def __init__(self):self.kongfu = '[古法煎饼果子配方]'print(f'Master_self:{self}')def make_cake(self):print(f'运用{self.kongfu}制作煎饼果子')class School():def __init__(self):self.kongfu = '[学校煎饼果子配方]'print(f'School_self:{self}')def make_cake(self):print(f'运用{self.kongfu}制作煎饼果子')class Prentice(School,Master):def __init__(self):self.kongfu = '[独创煎饼果子配方]'def make_cake(self):#如果是先调用了父类的属性和方法,则父类属性和方法会覆盖子类属性和方法,故在调用属性前,先调用自己子类的初始化self.__init__() #加自己的初始化的原因:如果不加这个自己的初始化,kongfu属性值是上一次调用的init内的kongfu属性值print(f'运用{self.kongfu}制作煎饼果子')#调用父类方法,但是为了保证调用到的也是父类的属性,必须在调用方法前调用父类的初始化def make_master_cake(self):#再次调用初始化的原因:这里想要调用父类的同名方法和属性,属性在init初始化位置,所以需要再次调用initMaster.__init__(self) #接收将来调用的对象Master.make_cake(self)def make_school_cake(self):School.__init__(self)School.make_cake(self)daqiu = Prentice()
daqiu.make_cake()
print(f'-------------------------------------------------')
daqiu.make_master_cake()
print(f'daqiu={daqiu}')
print(f'-------------------------------------------------')
daqiu.make_school_cake()
print(f'-------------------------------------------------')
daqiu.make_cake()
2、为什么自己调用init
def make_cake(self):#如果是先调用了父类的属性和方法,则父类属性和方法会覆盖子类属性和方法,故在调用属性前,先调用自己子类的初始化self.__init__()print(f'运用{self.kongfu}制作煎饼果子')daqiu = Prentice()
daqiu.make_cake()
print(f'-------------------------------------------------')
daqiu.make_master_cake()
print(f'daqiu={daqiu}')
print(f'-------------------------------------------------')
daqiu.make_school_cake()
print(f'-------------------------------------------------')
daqiu.make_cake()
否则出现调用自己make_cake方法,他的初始化属性还是学校的
运用[独创煎饼果子配方]制作煎饼果子
-------------------------------------------------
Master_self:<__main__.Prentice object at 0x0000000003B497F0>
运用[古法煎饼果子配方]制作煎饼果子
daqiu=<__main__.Prentice object at 0x0000000003B497F0>
-------------------------------------------------
School_self:<__main__.Prentice object at 0x0000000003B497F0>
运用[学校煎饼果子配方]制作煎饼果子
-------------------------------------------------
运用[学校煎饼果子配方]制作煎饼果子