⼦类调⽤⽗类的同名⽅法和属性

说明

子类调用父类同名方法和属性

同名方法2种形式: 通过父类名.方法名()调用指定父类的方法  && super().方法名() # 调用父类的同名方法

同名属性2种形式: 父类名.__init__(self)让父对象初始化(实例属性) 或父类名.类属性

 

方法1:父类名.方法名()

复制代码
 1 '''
 2 ⼦类调⽤⽗类的同名⽅法和属性:2种方式
 3 1. 通过父类名.方法名()调用指定父类的方法
 4 '''
 5 
 6 
 7 # 1. 师父类,属性和方法
 8 class Master(object):
 9     def __init__(self):
10         self.kongfu = '[古法煎饼果子配方]'
11 
12     def make_cake(self):
13         print(f'执行了Master类的make_cake方法--运用{self.kongfu}制作煎饼果子')
14 
15 
16 # 为了验证多继承,添加School父类
17 class School(object):
18     def __init__(self):
19         self.kongfu = '[高等教育煎饼果子配方]'
20 
21     def make_cake(self):
22         print(f'执行了School类的make_cake方法--运用{self.kongfu}制作煎饼果子')
23 
24 
25 # 2. 定义徒弟类,继承师父类 和 学校类, 添加和父类同名的属性和方法
26 class Prentice(School, Master):
27     def __init__(self):
28         self.kongfu = '[独创煎饼果子技术]'
29 
30     def make_cake(self):
31         # 加自己的初始化的原因:如果不加这个自己的初始化,kongfu属性值是上一次调用的init内的kongfu属性值
32         self.__init__()
33         print(f'运用{self.kongfu}制作煎饼果子')
34 
35     # 子类调用父类的同名方法和属性:把父类的同名属性和方法再次封装
36     def make_master_cake(self):
37         # 父类类名.方法()
38         # 再次调用初始化的原因:这里想要调用父类的同名方法和属性,属性在init初始化位置,所以需要再次调用init
39         Master.__init__(self)
40         Master.make_cake(self)  # 通过父类类名.方法()方式调用父类的方法
41 
42     def make_school_cake(self):
43         School.__init__(self)
44         School.make_cake(self)
45 
46 
47 # 3. 用徒弟类创建对象,调用实例属性和方法
48 prentice_allen = Prentice()
49 prentice_allen.make_cake()  # 运用[独创煎饼果子技术]制作煎饼果子
50 
51 prentice_allen.make_master_cake()  # 执行了Master类的make_cake方法--运用[古法煎饼果子配方]制作煎饼果子
52 
53 prentice_allen.make_school_cake()  # 执行了School类的make_cake方法--运用[高等教育煎饼果子配方]制作煎饼果子
54 
55 prentice_allen.make_cake()  # 运用[独创煎饼果子技术]制作煎饼果子
56 
57 
58 
59 
60 class Parent:
61     name = "Parent"
62 
63 class Child(Parent):
64     name = "Child"
65 
66 child = Child()
67 print(child.name)             # 输出 "Child"
68 print(Parent.name)            # 输出 "Parent"
69 print(Child.name)             # 输出 "Child"
70 print(super(Child, child).name)  # 输出 "Parent"
71 '''
72 总结:
73     1. 类属性(class attribute)是类级别的属性,在所有实例之间共享。
74     2. 实例属性(instance attribute)是实例级别的属性,每个实例都有自己的属性副本。
75     3. 类属性可以通过类名或实例对象访问和修改。
76     4. 实例属性只能通过实例对象访问和修改。
77 '''
78 # print(Master.kongfu)  # 报错:AttributeError: type object 'Master' has no attribute 'kongfu'
复制代码

方法2:super().方法()

复制代码
 1 '''
 2 ⼦类调⽤⽗类的同名⽅法和属性2:super()方式
 3 '''
 4 
 5 
 6 class Parent:
 7     def __init__(self):
 8         self.attribute = "Parent Attribute"
 9 
10     def method(self):
11         print("Parent Method")
12 
13 
14 class Child(Parent):
15     def __init__(self):
16         super().__init__()
17         self.attribute = "Child Attribute"
18 
19     def method(self):
20         print("Child Method")
21         super().method()  # 调用父类同名方法
22         # 因为 super() 对象只能访问父类的方法,无法直接访问父类的实例属性。因此对应实例属性,子类对象继承。如果覆盖,无法访问到父类对象的实例属性
23         # print(super().attribute)  # 访问父类的属性(实例属性)  AttributeError: 'super' object has no attribute 'attribute'
24 
25 
26 child = Child()
27 print(child.attribute)  # 输出:Child Attribute
28 child.method()
29 
30 # 输出结果:
31 # Child Attribute
32 # Child Method
33 # Parent Method
复制代码

 

posted @   Allen_Hao  阅读(41)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示