虚函数可以在Python中保密

时间:2017-02-11 04:46:22

标签: python

我想在Python中使用虚拟机制,并按如下方式实现:

class A() :
    def __init__(self) :
        self.level()

    def level(self) :
        print("At level A")

class B(A)
    def level(self) :
        print("At level B")

它按预期工作:

>>>b = B()
At level B

然后我想通过将函数名改为__level()来保持level()函数的私有性:

class A() :
    def __init__(self) :
        self.__level()

    def __level(self) :
        print("At level A")

class B(A)
    def __level(self) :
        print("At level B")

但它不起作用:

>>>b = B() 
At level A

当函数变为私有时,虚拟机制神奇地丢失了!有人可以帮忙解释原因吗?

1 个答案:

答案 0 :(得分:1)

  

由于类私有成员有一个有效的用例(即为了避免名称与子类定义的名称冲突),对这种称为名称修改的机制的支持有限。

Private Variables

class A() :
    def __init__(self) :
        self.__level()
        self._B__level()

    def __level(self) :
        print("At level A")

class B(A):
    def __level(self) :
        print("At level B")

In [228]: b=B()
At level A
At level B

由于这种错位,__level的B版本无法在A方法中使用(即使它们由B对象继承)。它必须明确使用受损的名称。打破这个“虚拟”功能链接(正如你所说)是破坏的目的,如上面的剪辑所述。

In [232]: b._A__level()
At level A
In [233]: b._B__level()
At level B
In [234]: b.__level()
....
AttributeError: 'B' object has no attribute '__level'