继承、多继承、魔法方法
python3 创建的类,默认继承 object父类/(顶级基类)超类
定义类的时候添加(object),兼容性较好
1.继承
定义:描述类与类的关系,(派生和类是同一个意思)
calss 类名(父类名1,2...) # 继承类
class A: def play(self): print('hello A') class B: def play(self): print('hello B') class C(A): # C类 继承 A类(C是A的子类,A是C的父类) pass C_c = C() C_c.play() # hello A
2.多继承
重写
-
定义:子类继承父类之后,如果子类不想使用父类的方法,定义与父类中已有的方法来覆盖父类方法
-
重写后再调用父类中的方法: 父类名.方法 / super().方法
class A: def play(self): print('hello A') class B: def play(self): print('hello B') class C(A,B): # C类 继承 A B 两类 ——多继承 # 按括号中继承顺序执行 def play(self): print('hellp C') C_c = C() C_c.play() # hello A ## 优先调用本身的方法
重写后还想使用父类中的功能
-
class C(A): def play(self): A.play(self) # 调用 supper().play() # 调用 ## 找最近的上级父类 print('hello C')
直接父类 —— base__
每个类中 “bases " 特殊属性(返回tuple)
bases:查看类的直接父类
class A(): def play(self): print('hello world !') class B(A): pass class C(B): # C 继承 A B 两类 ——多继承 pass C_c = C() print(C.__bases__) # 查看 C类的直接继承的父类 输出结果: (<class '__main__.B'>,) # C 的直接父类是 B类
supper 函数可以调用父类的方法,父类也可以使用supper函数
类在生成时会自动生成方法解析顺序
类继承顺序 —— mro
可以通过 类名 “ .mro() ”或者类名“ .mro ” 查看
print(C.mro()) # 查看类的继承关系,返回列表 输出结果: [<class '.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>] print(C.__mro__) # 查看类的继承关系,返回元组 输出结果: (<class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
分类越细,越复杂
3.魔法方法
__add__(self, other) # 进行加法运算的时候自用调用 # self 返回实例a , class A: def __add__(self, other): # 加法运算,参数规范 print(self) # self 返回实例a print(other) a = A() a + 2 # 传值到self # 哪个实例在+号左边,则调用哪个参数 # a 需写在代码左边,否则会报错 b = 类名(参数) C = 类名(参数)
[ str repr(字符串类型,必须要有返回值) call ]
有什么区别,又什么关键点,长什么样子
弄清楚在什么时候需要调用魔法方法!!!
class A: def __add__(self, other): # 加法运算 参数规范 print(self) print(other) a = A() a + 2 # 2 # 传值到self # 哪个实例在+号左边,则调用哪 个参数 # a 需写在代码左边,否则会报错 print('a', a)
正常情况下,实例是不能像函数一样被调用的,要想实例能够被调用,就需要定义 call 方法.有call才能调用实例
类中的一些查询相关信息的方法