0

基本的に、これは私が達成したいことです:

class Move(object):
    def __init__(self, Attr):
        if Attr:
            self.attr = Attr

        if hasattr(self, "attr"):
            __call__ = self.hasTheAttr
        else:
            __call__ = self.hasNoAttr

    def hasNoAttr(self):
        #no args!

    def hasTheAttr(func, arg1, arg2):
        #do things with the args

    __call__ = hasNoAttr

それが機能しないことはわかっています。常に hasNoAttr を使用しているだけです。私の最初の考えは、デコレータを使用することでしたが、私はデコレータにあまり精通しておらず、クラス属性が存在するかどうかに基づいてそれをベースにする方法を理解できませんでした.

実際の質問の部分: 条件に応じて x 関数または y 関数のいずれかの関数を決定論的に作成するにはどうすればよいでしょうか。

4

1 に答える 1

3

__call__他の(非魔法の)メソッドでは、モンキーパッチを適用するだけで、この種のことを実際に行うことはできませんが__call__、他の魔法のメソッドでは、魔法のメソッド自体の中で適切なメソッドに委任する必要があります。

class Move(object):
    def __init__(self, Attr):
        if Attr:
            self.attr = Attr

        if hasattr(self, "attr"):
            self._func = self.hasTheAttr
        else:
            self._func = self.hasNoAttr

    def hasNoAttr(self):
        #no args!

    def hasTheAttr(func, arg1, arg2):
        #do things with the args

    def __call__(self,*args):
        return self._func(*args)
于 2013-01-29T19:03:53.623 に答える