考虑一个带有“私有(private)”方法的类,例如:
class Foo(object):
def __init__(self):
self.__method()
def __method(self):
print('42')
当我尝试子类化 Foo
并覆盖方法 __method
时,可以看到 Foo.__method
仍然被调用,而不是 MoreFoo.__方法
。
class MoreFoo(Foo):
def __method(self):
print('41')
>>> MoreFoo()
42
<__main__.MoreFoo object at 0x7fb726197d90>
覆盖这种方法的方法是什么?
最佳答案
使用双下划线命名约定的要点是为了防止子类(意外地)覆盖该方法。
如果您必须覆盖它,则表明有人犯了严重的类设计错误。您仍然可以这样做,只需这样命名您的对象:
def _Foo__method(self):
在方法名称前面加上一个下划线和定义的类名(因此在本例中以 _Foo
为前缀)。用双下划线重命名方法和属性的过程称为private name mangling .
如果你想定义一个在子类中仍然可以重写的“私有(private)”方法,你通常坚持使用带有一个下划线的名称 (def _method(self):
)。
由于其动态特性,Python 中几乎没有任何东西是真正私有(private)的;只要稍加反省,几乎任何事情都可以实现。
关于python - 在 Python 中覆盖 "private"方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14898197/