继承
继承
继承:类与类的关系,一种创建新类的方式
新建的类可以继承一个或多个父类(python支持多继承),父类又可称为基类或超类,新建的类称为派生类或子类。
查看继承关系:bases __base__只查看从左到右继承的第一个子类,__bases__则是查看所有继承的父类
查看继承顺序:类名.mro
初步认识继承:
class Class1: #定义父类
pass
class Class2: #定义父类
pass
class SubClass1(Class1): #单继承,基类是Class1,派生类是SubClass
pass
class SubClass2(Class1,Class2): #python支持多继承,用逗号分隔开多个继承的类
pass
实例1:
class Foo:
def __init__(self,name,sex):
self.name = name
self.sex = sex
def a(self):
print('尴尬')
class Bar(Foo):
def b(self):
print('不尴尬')
c = Foo('alex','hh')
c.a()
子类中调用父类的方法:
方法一:指名道姓,即父类名.父类方法()
class Vehicle:
Country = 'China'
def init(self,name,speed):
self.name = name
self.speed = speed
def run(self):
print('开动啦')
class Subway(Vehicle):
def init(self,name,speed,line):
self.line = line
Vehicle.init(self,name,speed,) #调用父类的方法,直接父类名点父类的方法,这里要加self注意!!!
line13 = Subway('中国地铁','1000人/箱','电')
line13.run() #返回;开动啦
方法二:super()
class Vehicle1:
def init(self,name,speed):
self.name = name
self.speed = speed
def run1(self):
print('开动啦1!!!!')
class Subway1(Vehicle1):
def init(self,name,speed,line):
super().init(name,speed) #这里没有self
self.line = line
line1 = Subway1('中国地铁','1000人/箱','电')
line1.run1() #返回;开动啦
继承查找属性,或者叫继承顺序
python2有经典类,新式类,py2是继承obiect 深度优先
python3只有新式类,广度优先
class Foo:
def f1(self):
print('Foo.f1')
def f2(self):
print('Foo.f2')
self.f1()
class Bar1(Foo):
def f1(self):
print('bar.f1')
b=Bar1()
b.f2()
总结:查找原则,是先在总结的实例中找-->然后去实例的类中找-->然后再去父类中找...直到最顶级的父类。
实例2:
class A:
def test(self):
print('aaa')
class B(A):
def test(self):
print('bbb')
class C(A):
def test(self):
print('ccc')
class D(B):
def test(self):
print('新式类广度优先')
class E(C):
def test(self):
print('eee')
class F(D,E):
pass
# def test(self):
# print('fff')
x = F()
x.test()
python3只有新式类,执行顺序是: F ,D ,B , E, C, A
python2,分新式类,经典类 执行顺序是: F, D, B, A, E, C