3

私のコードには、次のようにクラスのインスタンスを返すメソッドがあります。

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 組み込みとして利用できない場合、これはまだ疑問を残しています。でも、そうでなくても、この構造で生きていけると思います。

4

3 に答える 3

1

理由もなく物事を過度に複雑にしていると思います。おそらく、あなたは他の言語に慣れていて、そこから自分の習慣を取り入れたいと思っているでしょう.

IIUC、あなたは次のようなことをするつもりです:

class SomeClass:
    # typical stuff
    def __init__(self, other, arg1, arg2, arg3, arg4):
        self.parent= other
        # blah blah

class SomeOtherClass:
    # initialize in __init__, setup stuff
    def __init__(self, initarg1, initarg2):
        self.initarg1= initarg1
        self.initarg2= initarg2

    def fun(self, arg3, arg4):
        # return an instance of SomeClass based on
        # initargs and arguments
        return SomeClass(self, self.initarg1, self.initarg2, arg3, arg4)
于 2011-05-05T15:03:49.517 に答える
1

あなたが何をしようとしているのか正確にはわかりませんが、記述子を読みたいと思われます。

基本的に、記述子は、それ自体がメソッド__get__を定義するクラスであるクラスの属性です 。__set__あなたの場合、コードを からProps.__init__に移動し、クラスの属性としてProps.__set__設定すると、すべてが必要に応じて機能するはずです。Propsfun

于 2011-04-12T09:23:10.997 に答える
0

instancemethod デコレーターは必要ありません。これでうまくいくはずです。

class MyClass:
  class fun:
    def __init__( self, parent, *args ):
      self.parent = parent
      self.args = args

m = MyClass()
f = m.fun(None, 1, 2, 3)
print f.args

最初の例を次のように変更することもできます

class Props:
    def __init__( self, parent, *args ):
        self.parent = parent
        self.args = args


class MyClass:
    fun = Props

m = MyClass()
f = m.fun(None, 1, 2, 3)
print f.args
于 2011-04-12T09:09:21.613 に答える