继承顺序与封装结合的2个例子
有2个例子能很好地帮助我们理解继承顺序(例子来源海峰老师的讲课):
例一:
class A: def fa(self): print("from A") def test(self): self.fa() class B(A): def fa(self):
print("from B") b = B() b.test()
在上面的例子中,b 是B的一个实例化对象,b.test()是实例调用类中的函数的方法,对于实例来说是绑定方法;b调test方法的顺序:
----》b先在它自己那找,没有----》再在B那找,也没有----》再找到B的父类A,有,(下面是self.fa(),此时self是b,即self.fa()为b.fa() )
从b.fa()开始继续找,----》先在它自己那找,没有----》再在B那找,有,即执行 ----------》print("from B")
例二:
class A: def __fa(self): # _A__fa(self) print("from A") def test(self): self.__fa() # self._A__fa() class B(A): def __fa(self): # _B__fa(self) print("from B") b = B() b.test() # b._A__fa()
与例子一对比,例子二中使用__下划线对函数进行了封装,双下划线函数在定义的时候就进行了相应的变形或叫做转换,见上面代码后的注释,所以b.test()在调用test方法时顺序:
----》b先在它自己那找,没有----》再在B那找,也没有----》再找到B的父类A,有,(下面是self.__fa(),此时self是b,即self.__fa()为b.__fa() ,转化过来即为b._A__fa())
从b._A__fa()开始继续找,----》先在它自己那找,没有----》再在B那找,不一样也没有 ----》再在B的父类A那里找,有,即执行 ----------》print("from A")