class test:
def __init__(self):
test_dict = {'1': 'one', '2': 'two'}
def test_function(self):
print self.test_dict
if __name__ == '__main__':
t = test()
print t.test_dict
错误:
AttributeError: test instance has no attribute 'test_dict'
此外,如果我执行代码:t.test_function()
而不是print t.test_dict
,也会发生错误:
AttributeError: test instance has no attribute 'test_dict'
为什么呢?我在函数__init__
中定义了test_dict,所以它应该初始化为每个实例,但为什么python告诉我它找不到dict?
答案 0 :(得分:6)
您忘记了self
。
改变这个:
def __init__(self):
test_dict = {'1': 'one', '2': 'two'}
使用:
def __init__(self):
self.test_dict = {'1': 'one', '2': 'two'}
self
是您班级中方法中的实例。这不是因为self
是一个特殊的关键字,而是因为self
通常是选择作为方法的第一个参数。
如果您想了解self
的更多信息,可以给出一个很好的答案here。
最后请注意,当您尝试拨打
时,您获得了AttributeError
t.test_dict
因为test_dict
属性未定义。
答案 1 :(得分:1)
您在__init__
中犯了错误。这样:
def __init__(self):
test_dict = {'1': 'one', '2': 'two'}
应该是:
def __init__(self):
self.test_dict = {'1': 'one', '2': 'two'}
答案 2 :(得分:0)
将类/实例视为字典。无论何时创建实例并调用其任何方法,这些函数都会自动接收实例作为第一个参数(除非函数是静态或类方法)。
因此,如果您希望某个变量存储在实例中并稍后被访问,请将所有变量放入第一个参数(按照惯例,它被称为 self )。
类构造函数不是上述规则的例外。这就是为什么所有答案都指出 test_dict 赋值中构造函数的变化。
想一想:
self.test_dict = ...
像
self.__dict__["test_dict"] = ...
与Python中的所有变量一样,如果未先分配变量,则无法访问它。您原来的课程就是这种情况:
_ init _ 创建了一个本地(to method)变量,而 test_function 正试图访问字典中的实例变量,不存在。