需要在python类中路由实例调用

2024-05-16 13:30:54 发布

您现在位置:Python中文网/ 问答频道 /正文

问题是在选择应答器之前需要考虑这些参数。这是我目前为止的尝试。在

from responders import A, B, C

class RandomResponder(object)
    def init(self, *args, *kwargs):
        self.args = args
        self.kwargs = kwargs

    def __getattr__(self, name):
        # pick a responder based on the args the function was called with
        # I don't know how to do this part
        # for sake of argument lets the args a function was called with lead me to pick responder A
        r = A
        responder = r(*self.args, **self.kwargs)
        return responder.__getattr__(name)

预期效果是:

^{pr2}$

我不会提前知道应答器A、B和C包含的所有函数


Tags: thetonameself参数defwithargs
3条回答

关于:

RandomResponder = [A, B, C]
RandomResponder[0].doSomething()   # returns A.doSomething()
RandomResponder[1].doSomething()   # returns B.doSomething()
RandomResponder[2].doSomething()   # returns C.doSomething()
# etc

试试这个:

class RandomResponder(object):
    choices = [A, B, C]

    @classmethod
    def which(cls):
        return random.choice(cls.choices)

    def __getattr__(self, attr):
        return getattr(self.which(), attr)

which()从选项中随机选择一个选项,而getattr使用which获取属性。在

编辑:事实上看起来你想要更像这样的东西。在

^{pr2}$

这可以用lambda编写,但我还是这样写,这样会更清楚。在

当你这么做的时候

r.doSomething(1)

发生的情况是,按顺序:

  • ^调用{},并返回一个对象
  • 使用参数“1”调用此对象

在调用__getattr__时,您无法知道返回的对象将使用哪些参数来调用,或者即使它将被调用。。。在

因此,为了获得您想要的行为,__getattr__必须返回一个可调用的对象,该对象根据调用它的参数进行决策。例如

^{pr2}$

相关问题 更多 >