概述
继承就是复制父类的内容,到子类里面
In [1]: class Animal(object):
...: def __init__(self,name):
...: self.name=name
...: def speak(self):
...: print("animal")
...:
...: class Cat(Animal):
...: pass
In [2]: tom=Cat("tom")
In [3]: tom.name
Out[3]: 'tom'
In [4]: tom.speak()
animal
1. 私有方法和属性,不能被子类继承和访问
2. 子类和各个父类中如果有相同方法,优先调用自己,然后向上寻找最近父类(如果父类有平行类,则按继承顺序从左至右继承,可以用__mro__来查看继承顺序)“覆盖”一词用的并不好,并没有“覆盖”掉,只是调用的顺序不同。
3. 调用被重写父类的方法有两种
3.1. super().func()
3.2. name.func(self)
4. 调用父类同名方法的一个应用就是私有方法和属性不会被继承,但可以通过父类中调用私有方法的方法来调用父类的私有方法
class MyDict(dict):
def __init__(self,*args,**kwargs):
super(MyDict,self).__init__(*args,**kwargs)
self['modify'] = True
obj = MyDict()
print(obj)
父类的__init__
1.子类的__init__
会覆盖父类的__init__
导致父类无法初始化
class A:
def __init__(self):
A = 'A'
self.a = 'a'
print('init A')
class B(A):
def __init__(self):
self.b = 'b'
print('init B')
b = B()
print(b.A) # 由于B中的`__ini__()`方法覆盖了父类A中的,所以A没有被初始化
print(b.a)
2.使用父类的__init__
来初始化父类
class B(A):
def __init__(self):
A.__init__(self) # 在子类中的`__init__`来手动初始化父类,但是写父类的名称还不够智能,可以使用super()来代替
self.b = 'b'
print('init B')
b = B()
print(b.A)
print(b.a)
3.最终版,使用super()
class B(A):
def __init__(self):
A.__init__(self) # 可以使用super()来代替,而不需要关系父类的名称是什么
self.b = 'b'
print('init B')
b = B()
print(b.A)
print(b.a)
参考:
https://www.cnblogs.com/Peter2014/p/10844204.html
super讲解
https://www.runoob.com/python/python-func-super.html