python - 在 Python 中覆盖 "private"方法

标签 python oop methods subclass private-members

考虑一个带有“私有(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/

相关文章:

ruby - ruby 中的类/静态方法有什么用?

python - 没有重复和有序的数字列表

python - 如何将 __iter__ 添加到动态类型?

python - 将 Spark DataFrame 写入 Hive 表时的内存分配问题

c++ - 尝试在基类之外创建派生类的实例时出错

java - 创建许多对象类型/类只是为了使用 instanceof

python - PIL 将透明 PNG 加载为 RGB?

java - 如何将 Iterable<interface> 返回类型方法重写为 Iterable<?扩展接口(interface)>返回类型方法

java - 泛型:返回类型错误

objective-c - 方法问题中的多个参数