【问题标题】:Can't set class attributes in python using a method无法使用方法在python中设置类属性
【发布时间】:2012-07-04 20:08:38
【问题描述】:

初始化 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

【问题讨论】:

  • 你没有任何类属性,只有实例属性。

标签: python class attributes


【解决方案1】:

您正在将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"

【讨论】:

    【解决方案2】:

    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__: 之外,它与您的非常相似。运行这个,你应该对正在发生的事情有更好的了解。

    【讨论】:

      猜你喜欢
      • 2011-07-02
      • 1970-01-01
      • 2017-07-17
      • 1970-01-01
      • 2018-09-29
      • 1970-01-01
      • 2015-06-21
      • 1970-01-01
      • 2015-12-08
      相关资源
      最近更新 更多