继承
什么是继承
所谓继承指提供了同一类对象共性的处理方法,子类继承父类共性的东西。 这样有利于代码的复用性,即子类拥有父类的方法。通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。
继承可以想象成什么是什么的关系
python中类的继承分为:单继承和多继承
class Parent1: # 父类1 pass class Parent2: #父类2 pass class Son1(Parent1): #单继承,基类是ParentClass1,派生类是Son1 pass class Son2(Parent1,Parent2): #多继承,父类是Parent1和Parent2,派生类是Son2 pass
查看继承
>>> Son1.__bases__ #__base__只查看从左到右继承的第一个父类,__bases__则是查看所有继承的父类 (<class ‘__main__.Parent1‘>,) >>> Son2.__bases__ (<class ‘__main__.Parent1‘>, <class ‘__main__.Parent2‘>)
如果没有指定基类,python的类会默认继承object类,object是所有python类的基类
>>> Parent1.__bases__
(<class ‘object‘>,)
# class Animal:
# def __init__(self,name,eat,drink,push,shit):
# self.name=name
# self.eat= eat
# self.drink= drink
# self.push= push
# self.shit= shit
# class Dog(Animal):
# def cry(self):
# print(‘%s汪汪汪‘%self.name) #在子类中可以使用父类继承的name
# class Cat(Animal):
# def cry(self):
# print(‘%s喵喵喵‘%self.name)
#
# teddy=Dog(‘泰迪‘,‘吃‘,‘喝‘,‘拉‘,‘撒‘)
# cat1=Cat(‘加菲‘,‘吃‘,‘喝‘,‘拉‘,‘撒‘)
# print(cat1.name) #调用属性无需添加()
# teddy.cry() #调用方法需要添加(),因为方法本质是函数
加菲
泰迪汪汪汪
在python3中,子类执行父类的方法也可以直接用super方法.
# class Animal: # def __init__(self,name,eat,drink,push,shit): # self.name=name # self.eat= eat # self.drink= drink # self.push= push # self.shit= shit # def run(self): # print(‘%s running‘%self.name) # class Dog(Animal): # def cry(self): # super(Dog,self).run() #super(Dog,self).run() =Animal().run(self)=super().run() 执行父类的方法 # print(‘%s汪汪汪‘%self.name) # class Cat(Animal): # def cry(self):
super().__init() #执行父类的属性 # print(‘%s喵喵喵‘%self.name) # # teddy=Dog(‘泰迪‘,‘吃‘,‘喝‘,‘拉‘,‘撒‘) # cat1=Cat(‘附近反‘,‘吃‘,‘喝‘,‘拉‘,‘撒‘) # print(teddy.name) # teddy.cry()
多继承顺序
python3以上(新式类): 广度优先
python2(经典类) :深度优先
class A(object): def test(self): print(‘from A‘) class B(A): def test(self): print(‘from B‘) class C(A): def test(self): print(‘from C‘) class D(B): def test(self): print(‘from D‘) class E(C): def test(self): print(‘from E‘) class F(D,E): # def test(self): # print(‘from F‘) pass f1=F() f1.test() print(F.__mro__) #只有新式才有这个属性可以查看线性列表,经典类没有这个属性
<class ‘__main__.F‘>, <class ‘__main__.D‘>, <class ‘__main__.B‘>, <class ‘__main__.E‘>, <class ‘__main__.C‘>, <class ‘__main__.A‘>, <class ‘object‘>
#新式类继承顺序:F->D->B->E->C->A #经典类继承顺序:F->D->B->A->E->C #python3中统一都是新式类 #pyhon2中才分新式类与经典类
多态
什么是多态:相同方法调用,执行不同动作
向不同的对象发送同一条消息(!!!obj.func():是调用了obj的方法func,又称为向obj发送了一条消息func),不同的对象在接收时会产生不同的行为(即方法)。 也就是说,每个对象可以用自己的方式去响应共同的消息。所谓消息,就是调用函数,不同的行为就是指不同的实现,即执行不同的函数。
import abc class Animal(metaclass=abc.ABCMeta): #同一类事物:动物 @abc.abstractmethod def talk(self): pass class People(Animal): #动物的形态之一:人 def talk(self): print(‘say hello‘) class Dog(Animal): #动物的形态之二:狗 def talk(self): print(‘say wangwang‘) class Pig(Animal): #动物的形态之三:猪 def talk(self): print(‘say aoao‘)
def func(object)
object.talk() #我们可以定义一个统一的接口来使用 三个类都有talk的方法