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 回答