2011-02-09 7 views
0

私はそれは私がそれを実行しようとすると、MyClassAが定義されていない私に教えてくれますがPythonオブジェクトのクラスメソッドをクラス属性内でどのように参照できますか?

class MyClassA(object): 
    an_attr = AnotherClassB(do_something=MyClassA.hello) 

    @classmethod 
    def hello(cls): 
     return "Hello" 

...の線に沿って何かをしたいと思います。

  • an_attrは、私はhello()は、クラスメソッド

任意のアイデアを維持した場合AnotherClassB

  • は私が好む変更することはできません
  • クラス属性でなければなりませんか?

  • 答えて

    3

    あなたがそれを使用する前に、あなただけの正しい順序を取得する必要があり、それが定義されています:私たちはクラスを作成しているとき、それは名前空間にありますので、私達はちょうど参照してください、ということ

    class MyClassA(object): 
        @classmethod 
        def hello(cls): 
         return "Hello" 
    
        an_attr = AnotherClassB(do_something=hello) 
    

    注意をhelloに、MyClassA.helloにはなりません。

    EDIT:申し訳ありませんが、これは私が思ったように実際には行いません。エラーなしでクラスを作成しますが、AnotherClassBは呼び出すことができないバインドされていないクラスメソッドへの参照のみを取得します。

    +0

    優秀、私はそれがクラス定義の中にあることを非常に好む。 –

    +1

    これは疑わしいものとしては機能しません。少なくとも 'AnotherClassB'は' cls'パラメータとしてどのクラスを渡すべきかわからないので、 'hello'で何もできません。 –

    +0

    私の悪いです。私はそれが 'classmethod'によってクラスにバインドされていると仮定しましたが、それは属性を取得することによって束縛されているようです。それは静的メソッドのために働くでしょうか? –

    3

    クラスを定義するとき、そのクラスはまだ存在しません。ですから、クラス定義の後までan_attrの作成を延期する必要があります。

    class MyClassA(object): 
        @classmethod 
        def hello(cls): 
         return "Hello" 
    MyClassA.an_attr = AnotherClassB(do_something=MyClassA.hello) 
    
    +0

    user387821ちょうどそこに+1します。 –

    +0

    @StephenPaulger:上のソート順を選択して簡単に確認できるので、最初に答えを掲載しました。それは決して重要ではありません::) –

    2

    私はこれがうまくいくかどうかわからないんだけど、それを試してみますか?

    class MyClassA(object): 
        @classmethod 
        def hello(cls): 
         return "Hello" 
    
        MyClassA.an_attr = AnotherClassB(do_something=MyClassA.hello) 
    
    +0

    私は答えが何かのようになるかもしれないことを恐れていました:)ありがとう、それは動作します。 –

    関連する問題