我想在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
当函数变为私有时,虚拟机制神奇地丢失了!有人可以帮忙解释原因吗?
答案 0 :(得分:1)
由于类私有成员有一个有效的用例(即为了避免名称与子类定义的名称冲突),对这种称为名称修改的机制的支持有限。
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'