继承
概念
继承是指在现有类的基础上派生出新的类。新有类将共享现有类的属性和行为,并且可以在派生类中新增属性和行为。当我们定义一个class的时候,可以从某个现有的class继承,新的class称为派生类、子类(Subclass),而被继承的class称为基类、父类或超类(Base class、Super class)。
格式
class 类名(父类):
pass
特性
子类可以继承父类的全部属性和方法。
Dog 和 Cat 类什么也没写,就拥有了父类的whoami方法。
class Animal():
def whoami(self):
print('我是一只动物')
class Cat(Animal):
pass
class Dog(Animal):
pass
cat1 = Cat()
dog1 = Dog()
cat1.whoami()
dog1.whoami()
---------------------
输出:
我是一只动物
我是一只动物
子类可以覆盖父类方法。
当子类的方法和父类的方法同名是,子类方法覆盖父类方法。
class Animal():
def whoami(self):
print('我是一只动物')
class Cat(Animal):
pass
class Dog(Animal):
def whoami(self):
print('我不仅是动物,我是狗,非常狗')
cat1 = Cat()
dog1 = Dog()
cat1.whoami()
dog1.whoami()
-------------
输出:
我是一只动物
我不仅是动物,我是狗,非常狗
父类中有__init__,子类中复用。
使用super().__init__(),调用父类中的__init__()
class Animal():
def __init__(self, name, age):
self.name = name
self.age = age
class Dog(Animal):
def __init__(self, name, age, color):
super().__init__(name, age)
self.color = color
def __str__(self):
return '小狗的名字:' + self.name + ',年龄:' + str(self.age) + ',颜色:' + self.color
dog1 = Dog('meatball', 3, 'black')
print(dog1)
-------------------
输出:
小狗的名字:meatball,年龄:3,颜色:black
多重继承
格式
class 类名(父类A, 父类B...):
pass
为什么要多重继承?
多重继承可以减少类的层次。
一般情况下继承是主线单一继承下来,但如果需要“混入”其他功能,就可以用到多重继承。这种设计模式通常称之为MixIn。
非多重继承
多重继承
多重继承示例
class Animal():
def msg(self):
print('我是一只动物')
class Swim():
def skill(self):
print('我会游泳')
class Fly():
def skill(self):
print('我会飞')
class Fish(Animal, Swim):
pass
class Bird(Animal, Fly):
pass
fish1 = Fish()
bird1 = Bird()
print('----fish1----')
fish1.msg()
fish1.skill()
print('----bird1----')
bird1.msg()
bird1.skill()
---------------------
输出:
----fish1----
我是一只动物
我会游泳
----bird1----
我是一只动物
我会飞
查看多重继承搜索顺序
(搜索方法的优先级)
- 类名.__mro__
- inspect.getmro(类名);(需要import inspect)
class Animal():
def msg(self):
print('我是一只动物')
class Fly():
def skill(self):
print('我会飞')
class Bird(Animal, Fly):
pass
print(Bird.__mro__)
--------------------
输出:
(<class '__main__.Bird'>, <class '__main__.Animal'>, <class '__main__.Fly'>, <class 'object'>)