无法访问__init__中的字典?

时间:2012-02-24 12:18:33

标签: python dictionary init

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?

3 个答案:

答案 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 正试图访问字典中的实例变量,不存在。