无法使用方法在python中设置类属性

时间:2012-07-04 20:08:38

标签: python class attributes

初始化Foo对象确实运行方法func(),但无论如何,self.a的值都设置为None。

如何使以下代码生效?

#!/usr/bin/env python

class Foo(object):

    def __init__(self, num):
        self.a = self.func(num)
        print self.a

    def func(self, num):
        self.a = range(num)
        print self.a

    def __str__(self):
        return str(self.a)


def main():
    f = Foo(20)
    print f

if __name__ == "__main__":
    main()

输出结果为:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
None
None

2 个答案:

答案 0 :(得分:9)

您正在将self.a重置为该函数的返回值。由于该函数不返回任何内容,因此该值设置为None

def __init__(self, num):
    self.a = self.func(num)  # return value of function is None
    print self.a             # self.a is now None

def func(self, num):
    self.a = range(num)      # sets self.a to [0..19]
    print self.a             # prints [0..19]
    # implicit "return None"

答案 1 :(得分:3)

jterrace是对的。发生的是func()方法首先打印,而不是 init 方法。考虑一下这个程序:

#!/usr/bin/env python

class Foo(object):

    def __init__(self, num):
        self.a = self.func(num)
        print '__init__:', self.a

    def func(self, num):
        self.a = range(num)
        print 'func:', self.a

    def __str__(self):
        return str(self.a)

if __name__ == '__main__':
    f = Foo(20)
    print '__main__:', f

除了我将__init__:func:__main__:添加到相应功能的打印语句之外,它与您的非常相似。运行这个,您应该更好地了解正在发生的事情。