2009-08-11 17 views
0
#!/usr/bin/python 

class Bar(object): 

    @staticmethod 
    def ruleOn(rule): 
    if isinstance(rule, tuple): 
     print rule[0] 
     print rule[0].__get__(None, Foo) 
    else: 
     print rule 

class Foo(object): 

    @classmethod 
    def callRule(cls): 
    Bar.ruleOn(cls.RULE1) 
    Bar.ruleOn(cls.RULE2) 


    @classmethod 
    def check(cls): 
    print "I am check" 

    RULE1 = check 
    RULE2 = (check,) 

Foo.callRule() 

出力のように動作しません:あなたは、私は将来の使用のためのタプルのクラスメソッド関数への参照を保存しようとして見ることができるようにタプルのクラスメソッドの参照を格納する変数

<bound method type.check of <class '__main__.Foo'>> 
<classmethod object at 0xb7d313a4> 
<bound method type.check of <class '__main__.Foo'>> 

しかし、バインドされた関数を参照するのではなく、オブジェクト自体を格納しているようです。

ご覧のとおり、これは可変参照のために機能します。

__get__を取得する唯一の方法は、それが属しているクラスの名前を必要とします。これは、RULE変数割り当ての時点では利用できません。

答えて

0

これは、メソッドが実際にはPythonで機能するためです。それらは、構築されたクラスインスタンスでそれらを検索するときにのみ、バインドされたメソッドになります。詳細はthis questionへの私の答えを見てください。非タプル変形は、概念的にはクラスメソッドへのアクセスと同じであるために機能します。

あなたがクラスにバインドされたクラスメソッドを割り当てたい場合は、あなたがクラスを作成した後、あなたがそれを行う必要があります属性:

class Foo(object): 
    @classmethod 
    def callRule(cls): 
     Bar.ruleOn(cls.RULE1) 
     Bar.ruleOn(cls.RULE2) 

    @classmethod 
    def check(cls): 
     print "I am check" 

Foo.RULE1 = Foo.check 
Foo.RULE2 = (Foo.check,) 
+0

ありがとうございました、これは理にかなっています。 ちょうど好奇心から〜 作成中にクラス名を取得する方法はありますか? –

+0

いいえ。クラス本体が実行されている間、クラスオブジェクトは存在しません。クラスデコレータまたはメタクラスを使用して関数をバインドするのが最善の方法です。 –

関連する問題