从子类中访问Python父类变量

3

为什么这个不起作用?

class Parent:
    __var = "Whatever"

class Child(Parent):
    def printVar(self):
        print(self.__var)


Timmy = Child()

Timmy.printVar()

我遇到了以下异常:

Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 File "<stdin>", line 3, in printVar
AttributeError: 'Child' object has no attribute '_Child__var'

通常最好以小写字母开始实例的变量名,这样它们就不会与类混淆。因此,“Timmy”应该替换为“timmy”。 - Ted Klein Bergman
3个回答

2

1
你已经提供了一个名称被双重前置下划线所修饰的类变量__var。因此,你无法像使用__var那样轻松地访问它,而应该使用self._Parent__var。只有使用__varParent实例才能访问它,而不包括任何子类。
因此,为了仍然表明这个属性是私有的但避免这种名称修饰,你可以考虑只使用一个下划线。
class Parent:
    _var = "Whatever"

class Child(Parent):
    def printVar(self):
        print(self._var)

有人能解释一下在什么情况下(以及为什么)会使用双下划线而不是单下划线吗? - Thomas Fernandez
@ThomasFernandez 你可能想看一下这个问题。实际上,这是一个约定的问题,取决于你的使用情况,以及你是否希望进行名称混淆。 - miradulo
只需使用属性装饰器。 - dev

0

双下划线用于私有属性,你应该使用单下划线。

class Parent:
    _var = "Whatever"

class Child(Parent):
    def printVar(self):
        print(self._var)


Timmy = Child()

Timmy.printVar()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接