继承
继承就是为了解决两个有大量重复性代码的类,抽象出一个更抽象的类放公共代码,主要是代码复用,方便代码的管理与修改
类的继承包括属性和方法,私有属性也可继承
class Person(): # 默认是继承object超类
pass
class Man(Person):
pass
print(Person.__bases__) # __bases__查询父类
print(Man.__bases__) # 继承Person
class Person():
eat = '吃饭'
def __init__(self):
self.people = '人'
def shuijiao(self):
print('睡觉')
class Man(Person):
pass
print(dir(Person))
print(dir(Man)) # 属性方法全部继承
a = Man()
print(dir(a))
class Person():
def __init__(self, name):
self.name= name
class Man(Person):
pass
s = Man('张三') # 父类初始化要传值,子类也需要
print(s.name) # 张三
解决私有属性的调用
class Person():
def __init__(self, age):
self.__age = age
def run(self):
print(self.__age) # 这里可以调用私有属性
class Man(Person):
pass
# def to(self):
# print(self.__age) # 无法在子类调用私有属性
s = Man(18)
# s.to() # 无法直接调用父类的私有属性
print(dir(s)) # 但是私有属性也会被继承
s.run() # 通过写一个方法来调用私有属性
继承顺序
按照继承顺序来,首先是实例本身,然后是实例的类,然后是父类,以此类推,最后是object超类
class Person():
def __init__(self, age):
self.age = age
class Man(Person):
pass
s = Man(18)
print(s.__class__.__mro__) # (<class '__main__.Man'>, <class '__main__.Person'>, <class 'object'>)
print(Man.__mro__) # 跟以上一样
多继承
class Person():
texp = '直立行走'
def __init__(self, age):
self.name = '人'
self.age = age
self.__sex = '性别'
def run(self):
print('人会跑')
class Man(Person):
a = '父'
class Woman(Person):
a = '母'
class Son(Woman, Man): # 谁在前,就先继承谁,依据这里
pass
print(Son.__mro__)
# (<class '__main__.Son'>, <class '__main__.Man'>, <class '__main__.Woman'>, <class '__main__.Person'>, <class 'object'>)
继承的属性或方法与父类同名会怎么样
先继承谁的,就依据谁的,按照上面的这个代码的话,那就是继承Woman的,如果是需要调用到 “a” 那么就是输出 “母”
重构(重写)
class Person():
def __init__(self, age):
self.age = age
class Man(Person):
a = '父'
class Woman(Person):
a = '母'
class Son(Woman, Man):
def __init__(self, name): # 父类子类同时初始化,也是按照继承顺序来
self.name = name
s = Son('张三')
print(s.name) # 初始化按照继承顺序来
定向继承
super,指定继承,需要有继承关联
super(): 是用于调用父类的一个方法,遵循就近原则
是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(mro)、重复调用
class Person():
def __init__(self, age):
self.age = age
def eat(self):
print('吃饭')
class Man(Person):
a = '父'
class Woman(Person):
a = '母'
class Son(Woman, Man):
def run(self):
super().eat()
print(super().a)
print(super(Woman, self).a)
s = Son(18)
s.run()
# 吃饭
# 母
# 父