访问实例变量时出现“AttributeError”

时间:2018-02-16 16:12:27

标签: python python-3.x instance-variables attributeerror

Python在运行我的脚本时引发了以下异常。有人可以解释为什么会发生这种情况以及如何解决它?

Traceback (most recent call last):
  File "C:\Users\vinsunny\AppData\Local\Programs\Python\Python36\test.py", line 28, in <module>
    test.my_func()
  File "C:\Users\vinsunny\AppData\Local\Programs\Python\Python36\test.py", line 23, in my_func
    print('non secret no. from test_func: ', self.number2)
AttributeError: 'Test' object has no attribute 'number2'"
class Test():

    __class_secret_number = 100

    def __secret_func(self):
        self.number1 = 1
        self.__secret_number1 = 11
        print('You cannot see this unless accessing from the Class itself')

    def test_func(self):
        self.number2 = 2
        self.__secret_number2 = 22

    def my_func(self):
        self.__secret_func()
        print('Secret no. from class: ', self.__class_secret_number)

        print('non secret no. from secret func: ', self.number1)
        print('Secret no. from secret func: ', self.__secret_number1)

        # These two prints raise an exception.
        print('non secret no. from test_func: ', self.number2)
        print('Secret no. from test_func: ', self.__secret_number2)

test = Test()
test.my_func()

2 个答案:

答案 0 :(得分:2)

执行违规的print语句时,number2实例上的Test属性尚未定义。

第一次number2属性设置在test_func()方法中。即在调用number2之前尝试访问test_func()将导致您观察到的错误。

您应该在self.number2类的初始值设定项中为Test指定默认值。您也可以在致电test_func()之前致电my_func()。但是,无论哪种方式,在Test.__init__中初始化所有实例属性仍然是一种很好的做法。

当您尝试访问__secret_number_2中的未定义属性my_func()时,解释器会出于同样的原因引发异常。

答案 1 :(得分:0)

永远不会调用

test_func,因此number2__secret_number2不存在。

需要在尝试访问它们之前调用该函数,或者使用 init 方法初始化它。