7

是否有可能发生不覆盖?例如:

class A:
    def __init__(self, name):
        self.name = name

class B(A):
    def __init__(self, name):
        A.__init__(self, name)
        self.name = name + "yes"

B 类有什么办法self.name可以独立于 A 类,还是必须使用不同的名称?

4

1 回答 1

10

使用两个下划线为名称添加前缀会导致名称混乱,这似乎是您想要的。例如

class A:
    def __init__(self, name):
        self.__name = name

    def print_name(self):
        print self.__name


class B(A):
    def __init__(self, name):
        A.__init__(self, name)
        self.__name = name + "yes"

    def print_name(self):
        print self.__name

    def print_super_name(self):
        print self._A__name #class name mangled into attribute

在类定义中,您可以__name正常处理(如在print_name方法中)。在子类中,以及类定义之外的任何其他地方,类的名称与前面的下划线混合到属性名称中。

b = B('so')
b._A__name = 'something'
b._B__name = 'something else'

在您发布的代码中,子类属性将覆盖超类的name,这通常是您想要的。如果您希望它们分开,但具有相同的变量名,请使用下划线

于 2012-08-13T00:58:49.500 回答