5

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
4

2 に答える 2

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"
于 2012-07-04T20:10:38.580 に答える
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__:それぞれの関数のprintステートメントに追加したことを除けば、これはあなたのものと非常によく似ています。これを実行すると、何が起こっているのかをよりよく理解できるはずです。

于 2012-07-04T20:18:20.140 に答える