继承顺序与封装结合的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")

 

posted @ 2017-10-31 16:36  生如夏花和秋叶  阅读(171)  评论(0编辑  收藏  举报