无法在类内调用函数?

时间:2019-09-03 02:43:36

标签: python class

我目前正在编写一些代码,并具有一个主类(称为“启动”)和一个辅助类,该类在被调用时会激活某些东西(称为“ 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

1 个答案:

答案 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