2017-02-21 12 views
4

次のコードを考えてみましょう:クラス継承

class A(object): 
    a = [] 

    @classmethod 
    def eat(cls, func): 
     print "called", func 
     cls.a.append(func) 


class B(A): 
    @A.eat 
    def apple(self, x): 
     print x 

    A.eat(lambda x: x + 1) 


print A.a 

出力: called <function apple at 0x1048fba28> called <function <lambda> at 0x1048fbaa0> [<function apple at 0x1048fba28>, <function <lambda> at 0x1048fbaa0>]

私たちはさえobject.Howをここで追加取得2機能している作成されていないようA.aが空になることが期待まさに何? eat2回と呼ばれるようになっていますか?

+2

クラスのすべてのステートメントは、クラスをロードするときに実行されます。 'クラスA:print( 'hello')'は、クラスをロードするときに "hello"を出力します。クラス '' print A.a'がなくても、最初の2つの出力を取得しても '@ A.eat'と' A.eat() 'の両方が実行されます。 – AChampion

答えて

5

あなたはここにPythonの実行モデルについての詳細を読むことができます。

クラス本体内の(ただし関数定義外の)コードはすべて実行時に実行されます。

クラスオブジェクトがインスタンス化されるたびに実行されるコードを作成する場合は、__init__クラスメソッドに配置します。 some tutorialsは間違いないが、混乱に追加され、これは誤解していること

注意:クラスを定義するときに何のコードが実行されません

- あなたは、単に 関数と変数を作っています。

これは単に間違っています。