私のコードには、次のようにクラスのインスタンスを返すメソッドがあります。
class MyClass:
def fun( self, *args ): # the method
return Props( self, *args )
class Props: # the returned object
def __init__( self, parent, *args ):
self.parent = parent
self.args = args
物事を整理するために、Props を MyClass 内に配置することを検討しています。次に、次のように、fun をバイパスして、クラスを MyClass のインスタンス メソッドに直接作成します。
class MyClass:
@instancemethod # does not exist!
class fun:
def __init__( self, parent, *args ):
self.parent = parent
self.args = args
コメントに注意してください - instancemethod デコレータは存在しません。
これを行う方法、つまり、呼び出し可能なオブジェクトをインスタンス メソッドに変換する方法はありますか? @instancemethod を @classmethod に変更すると、構築は機能しますが、もちろん親はインスタンスではなくクラスです。反対の操作と思われるものについて何も見つけられないことに驚いています。
これがクリアされたことに興味があります!
編集:
私の質問が明確ではなかったようです。私が持っているのは、単一の値やタプルではなく、データでいっぱいのオブジェクトを返すメンバー関数 fun です。このデータは、MyClass オブジェクトと関数の引数の内容に基づいて生成されます。私の最初のコードは、私が望むことを正確に行います。2番目のコードは、私が好む書き方です。
さらに、私が探しているデコレータは単に次のものであることに気付きました:
def instancemethod( cls ):
def f( *args ):
return cls( *args )
return f
もちろん、これは私が回避しようとした「楽しい」方法と同じです。また、一見したところそのように見えるかもしれませんが、些細な「return cls」は同一ではないことに注意してください。
このデコレーターを使用すると、2 番目のクラス定義が有効になり、目的の結果が生成されます。つまり、a.fun() は、a のデータに基づいて (潜在的に) 初期化されるオブジェクトを返します。
a = MyClass()
p = a.fun(1,2,3)
print a # <__main__.MyClass instance at 0xb775b84c>
print p.parent # <__main__.MyClass instance at 0xb775b84c>
print p.args # (1, 2, 3)
classmethod と staticmethod の次に省略されているように見えるため、ここで定義された instancemethod が python 組み込みとして利用できない場合、これはまだ疑問を残しています。でも、そうでなくても、この構造で生きていけると思います。