2016-10-20 13 views
0

私は周りを回らないような一見簡単なことです。毎回クラスデコレータが呼び出されません

registry = {} 

def register(cls): 
    registry[cls.__clsid__] = cls 
    print cls 
    return cls 

@register 
class Foo(object): 
    __clsid__ = "123-456" 

    def bar(self): 
     pass 
c=Foo() 
d=Foo() 

e=Foo() 

出力:

<class '__main__.Foo'> 

今私は、デコレータがtimes.Whyは、それが唯一のonceと呼ばれてきた3と呼ばれることを期待しています。

+0

ここで何を達成しようとしていますか?クラスオブジェクトは1回だけ作成されます。より多くのクラスを作成していない場合は、インスタンス*を作成しています。これらの 'Foo()'呼び出しは 'class'文を再実行しません。 –

答えて

2

クラスが作成されるときに、クラスデコレータがに適用されます。ではなく、インスタンスが作成されます。

@register行は、class Foo(object):ステートメントのみに適用されます。これは、モジュールがインポートされるときに、を1回だけとして実行されます。

インスタンスは、インスタンスがクラスへの参照を保持するオブジェクト(type(c)Fooクラスオブジェクトを返します)であるため、クラスステートメントを再実行する必要はありません。インスタンスはクラスオブジェクトの 'コピー'ではありません。

あなたが__init__か(あまりにも装飾することができる)クラスの__new__方法でそうする必要がありますいずれかのインスタンスを登録したい場合。 __new__はインスタンスの作成を担当し、__init__はそのインスタンスを初期化するために呼び出されるフックです。

+0

しかし 'class'は' object'が作成されたときに生まれるテンプレートです – vks

+1

@vks:いいえ、クラスはオブジェクトです。そのオブジェクトを呼び出すと、そのクラスへの参照を保持するインスタンスが生成されます。その参照属性が解決され、メソッドがどのように見つけられるかなどがわかります。 –

+0

こんにちはhttp://stackoverflow.com/questions/6760685/creating-a-singleton-in-python私たちはクラスのためのシングルトンデコレータを持っています....ただ1つのオブジェクトを許可する...デコレータが一度だけ呼び出されると、これはこれを管理していますか? – vks

2

クラスデコレータがクラス自体に適用されており、クラスが定義されているときに一度だけ適用されます。基本的には、クラス定義を処理して新しいクラスを生成します。

あなたは一度だけ処理します。

関連する問題