一、继承、多继承
1、子类 父类
class Animal:
def __init__(self, name, color, voice):
self.name = name
self.color = color
self.voice = voice
def eat(self):
print(self.voice)
def run(self):
print(self.color)
class Person: # 没有继承关系独立个体
def eat(self):
print("happy")
class Dog(Animal): # 单继承:子类(派生类)只继承一个父类(基类)
def eat(self):
print(self.voice)
class Cat(Person, Animal): # 多继承:子类继承了多个父类
def run(self):
print("热")
2、两种继承顺序
# 第一种
class A:
def f(self):
print("A")
class B:
def f(self):
print("B")
class C(A):
def f(self):
print("C")
class D(B):
def f(self):
print("D")
class E(C, D):
def f(self):
print("E")
e = E() # 实例化对象
e.f() # 调用方法 self始终指向的是实例对象e,所以方法选择优先级始终从E类开始
# 继承顺序 E---C----A---D---B
第二种
class F:
def f(self):
print("F")
class A(F):
def f(self):
print("A")
class B(F):
def f(self):
print("B")
class C(A):
def f(self):
print("C")
class D(B):
def f(self):
print("D")
class E(C, D):
def f(self):
print("E")
e = E() # 实例化对象
e.f() # 调用方法 self始终指向的是实例对象e,所以方法选择优先级始终从E类开始
# 继承顺序 E---C---A---D---B---F
如果2个继承同一个 顺序放到后面
3、查看继承关系的方法
print(Dog.mor()) #查看所有继承关系
print(Dog.__base__) #查看继承的父类
print(Dog.__base__) #查看所有继承的父类
4、重写后继承父类
class A:
def f(self):
print("A")
class B:
def f(self):
print("B")
class C(A):
def f(self):
print("C")
class D(B):
def f(self):
print("D")
class E(C, D):
def f(self):
print("E")
super().f() #调用父类下的f方法 和继承顺序关系一样
e = E()
e.f() #E C
5、Mix-in类
先分散最后在综合
class A:
pass
class B:
pass
class C:
pass
class D(A, B, C)
二、魔术方法
特定的方法去触发它
# __add__ 加法
class Rectangle:
def __init__(self, length, width):
self.length = length
self.width = width
def area(self):
areas = self.length * self.width
print(areas)
return areas
def __add__(self, other):
res = self.length + other.length
return res
one = Rectangle(8, 2)
two = Rectangle(6, 3)
one.area() # 调用方法 16
print(one + two) # 14 +就自动调用__add__方法
# 可以改变__add__方法 来通过+号 触发
把一个类的实例变成字符串
__str__ :字符串,对用户友好,适合print输出
__repr__ :__str__备胎,如果有__str__,print有限输出__str__
__call__ :正常情况下,实例是不能像函数一样被调用,如果想要掉用就要用这个方法
class A:
def __init__(self, num):
self.num = num
def __add__(self, other):
res = self.num - other.num
return res
def __call__(self):
print("调用成功")
one = A(55)
two = A(66)
print(one + two) #-11
#调用成功
one()