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初始化位置,所以需要再次调用init
Master.__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>
运用[学校煎饼果子配方]制作煎饼果子
-------------------------------------------------
运用[学校煎饼果子配方]制作煎饼果子