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

标签 python class instance

问题是在选择响应者之前需要考虑参数。到目前为止,这是我的尝试。

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)

期望的效果是:

r = RandomResponder()
r.doSomething(1)
#returns A.doSomething()
r.doSomething(2)
#returns B.doSomething()
r.doSomething(3)
#return C.doSomething()
r.doSomethingElse(1)
#returns A.doSomethingElse()
r.doSomethingElse(2)
#returns B.doSomethingElse()
r.doSomethingElse(3)
#returns C.doSomethingElse()

我不会提前知道响应器 A、B 和 C 包含的所有功能。

最佳答案

当你这样做的时候

r.doSomething(1)

按顺序发生的事情是:

  • r.__getattr__ 被调用,并返回一个对象
  • 使用参数“1”调用此对象

在调用 __getattr__ 时,您无法知道您返回的对象将用什么参数来调用,或者即使它会完全被调用...

因此,要获得您想要的行为,__getattr__ 必须返回一个可调用对象,该对象根据调用时使用的参数自行做出决定。例如

from responders import A, B, C

class RandomResponder(object):
    def __getattr__(self, name):
        def func(*args, **kwds):
            resp = { 1:A, 2:B, 3:C }[args[0]]    # Decide which responder to use (example)
            return getattr(resp, name)()         # Call the function on the responder
        return func

关于python - 需要在 python 类中路由实例调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/478655/

相关文章:

python - 将 PostScript 转换为图像

css - 用 BeautifulSoup 中的字符串替换字符串

python - 如何检查绑定(bind)方法是否与未绑定(bind)方法相同

javascript - JS嵌套原型(prototype)访问父节点

javascript - 新的 Backbone.Model() 与 Backbone.Model.extend()

python - request.params 中的关键错误

python - 解释器和脚本之间关于引用的差异

python - Pandas for 循环无法使用 iloc 正确更新行?

javascript - 从数组的副本中删除一个项目而不从原始数组中删除它

powershell - 如何使用 PowerSell 获取类提供的验证参数类