方法的重写,覆盖 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__)

一个原则,自己的私有属性,就该用自己的方法读取和修改,不要借助其他类的方法,即使是父类或者派生类的方法

posted @ 2020-10-03 18:00  ascertain  阅读(189)  评论(0编辑  收藏  举报