方法的重写,覆盖 override
class A:
def __init__(self,a):
self.a=a
class B(A):
def __init__(self,b,c):
self.b=b
self.c=c
def printv(self):
print(self.b)
print(self.a)
f=B(200,300)
print(f.__dict__)
print(f.__class__.__bases__)
f.printv()
class A:
def __init__(self,a,d=10):
self.a=a
self.__d=d
class B(A):
def __init__(self,b,c):
A.__init__(self,b+c,b-c)
self.b=b
self.c=c
def printv(self):
print(self.b)
print(self.a)
f=B(200,300)
print(f.__dict__)
print(f.__class__.__bases__)
f.printv()
如果父类中定义了__init__方法,你就该在子类的__init__中调用它,那子类什么时候自动调用父类的__init__方法呢
class A:
def __init__(self):
self.a1='a1'
self.__a2='a2'
print('A init')
class B(A):
pass
b=B()
print(b.__dict__)
B实例的初始化会自动调用基类A的__init__方法
class A:
def __init__(self):
self.a1='a1'
self.__a2='a2'
print('A init')
class B(A):
def __init__(self):
A.__init__(self)
self.b1='b1'
print('B init')
b=B()
print(b.__dict__)
class Animal:
def __init__(self,age):
print('Animal init')
self.age=age
def show(self):
print(self.age)
class Cat(Animal):
def __init__(self,age,weight):
super().__init__(age)
print('Cat init')
self.age=age+1
self.weight=weight
c=Cat(10,5)
c.show()
不调用父类__init__方法的,会导致没有实现继承效果,所以在子类的__init__方法中,应该显式调用父类的__init__方法
class Animal:
def __init__(self,age):
self.age=age
print('Animal init')
def show(self):
print(self.age)
class Cat(Animal):
def __init__(self,age,weight):
print('Cat init')
# 调用父类__init__方法的顺序决定这show方法的结果
super().__init__(age)
self.age=age+2
self.weight=weight
# Animal.__init__(self,age)
c=Cat(10,5)
c.show()

上图中没有调用父类__init__方法,__dict__没有_Animal__age属性,打印Cat类属性

上图中调用父类__init__方法,Cat子类生成的object的__dict__有_Animal__age属性,优先调用对象自身属性
class Animal:
def __init__(self,age):
self.__age=age
print('Animal init')
def show(self):
print(self,self.__age) # 被python替换成self._Animal__age
class Cat(Animal):
_Animal__age=888
def __init__(self,age,weight):
super().__init__(age)
print('Cat init')
self.__age=age+1
self.__weight=weight+1
c=Cat(10,5)
c.show()
print(c.__dict__)
class Animal:
def __init__(self,age):
self.__age=age
print('Animal init')
def show(self):
print(self,self.__age) # 被python替换成self._Animal__age
class Cat(Animal):
_Animal__age=888
def __init__(self,age,weight):
super().__init__(age)
print('Cat init')
self.__age=age+1
self.__weight=weight+1
def show(self): # 调用私有属性,应该override父类相关方法
print(self,self.__age)
c=Cat(10,5)
c.show()
print(c.__dict__)
一个原则,自己的私有属性,就该用自己的方法读取和修改,不要借助其他类的方法,即使是父类或者派生类的方法

浙公网安备 33010602011771号