Python:子类具有相同名称时如何避免名称冲突?

时间:2019-12-30 03:32:42

标签: python name-mangling

名称重整在大多数情况下都有效,但是当子类的名称与超类的名称相同时,则无效。例如,如果不同模块m2.A中的两个类扩展了m1.A,则m2.A.foo将隐藏m1.A.foo,因为它们两个都变成了_A__foo;是否有一个选项可以启用“更完整”的名称处理,即使用唯一的类标识符来处理类字段?

# m1.py
class C:
    def __foo(self):
        print('C1')

    def bar(self):
        self.__foo()

# main.py
from m1 import C as C1

class C(C1):
    # i mangle this for internal use within this class, not expecting it to
    # break a super class method; so i cant safely use a name even if it is
    # mangled; sad, is there a way to mangle with a guid across all classes?
    def __foo(self):
        print('CM')

C().bar()   # CM not C1

2 个答案:

答案 0 :(得分:1)

模块名称被设计为名称空间的一部分,我认为“全名修改”的最简单答案就是添加模块名称。

答案 1 :(得分:0)

如果您不能在子类中拿出一个与超类不同的有意义的名称,那应该告诉您以下两件事之一:

  • 设计中有些地方不对。您的子类是否真的与超类非常相似,因此您必须将其命名为相同的名称(或:子类中的属性确实与超类中的某些东西相似)吗?如果是这样,创建子类(或仅将其添加到子类中)是否有意义?

  • 您的名字没有意义。给事物起更多描述性的名称,这个问题就会消失。

相关问题