我目前正在编写一些代码,并具有一个主类(称为“启动”)和一个辅助类,该类在被调用时会激活某些东西(称为“ Ringer”)。我要做的就是用Ringer()
启动Ringer类,然后执行一些代码,并在满足条件时调用Ringer.__on()
。 Ringer.__off()
也是如此。
似乎我在做一些非常简单的错误。
下面是我要实现的一些代码...我得到的是Attribute Error
。
class Ringer:
def __init__(self):
print('__init__')
def __on(self):
print('turn on')
def __off(self):
print('turn off')
class start:
def __init__(self):
Ringer() #init something
Ringer.__on() #call ONLY the on function
Ringer.__off() #call ONLY the off function
if __name__ == '__main__':
start()
以上代码的输出应为
__init__
turn on
turn off
答案 0 :(得分:0)
您在属性名称前使用双下划线。结果是名称被破坏了。 (例如,__on
-> _<insert class where __on is defined>__on
。)
因此,您应该访问 _Ringer__on
而不是 __on
此外,在创建 Ringer
的实例后,您不会对其进行任何操作。
相反,我建议将实例绑定到一个变量:
ringer = Ringer()
ringer._Ringer__on()
ringer._Ringer__off()
既然我们知道问题是什么,以及如何解决它,那么问题来了:
<块引用>为什么python会用双下划线破坏属性?
好吧,想想电灯开关。灯开关上有一个盖子。这是否会阻止您使用它?不!您仍然可以使用它,但您必须先取下盖子。盖子是保护电灯开关,而不是私密。如您所知,电灯开关可能很危险。封面保护你!这就是 python 名称混乱的原因。这是防止意外使用,而不是防止您访问它。
现在,这在哪些方面有帮助?
好吧,如果您不想意外访问某个属性,则可以命名 mangle。 (例如,age
属性。)
示例:
class Animal:
def __init__(self):
self.__age = 0
print("My age is:", self.__age)
class Human(Animal):
def __init__(self):
Animal.__init__(self)
john = Human()
print(john.__age) # error!
print(john._Animal__age) # ok