Python uuu getattribute uuu(或uuu getattr uuu)来模拟php调用

Python uuu getattribute uuu(或uuu getattr uuu)来模拟php调用,python,class,Python,Class,我想创建一个有效地实现这一点的类(将一点PHP与Python混合) 中产阶级(对象): #self.apply是一个将函数应用于列表的函数 #例如self.apply=[]。。。self.apply.append(foobar) 定义调用(self、name、*args): self.apply(名称,*args) 因此允许代码表示: m = Middle() m.process_foo(a, b, c) m=中间() m、 工艺流程图(a、b、c) 在本例中_call()是PHP _ca

我想创建一个有效地实现这一点的类(将一点PHP与Python混合)

中产阶级(对象): #self.apply是一个将函数应用于列表的函数 #例如self.apply=[]。。。self.apply.append(foobar) 定义调用(self、name、*args): self.apply(名称,*args) 因此允许代码表示:

m = Middle() m.process_foo(a, b, c) m=中间() m、 工艺流程图(a、b、c)
在本例中_call()是PHP _call()方法,当在对象上找不到方法时调用该方法

考虑将参数作为参数传递给您的方法,而不是编码到方法名称中,然后将该名称神奇地用作参数

您在哪里编写不知道将调用什么方法的代码

为什么要调用
c.do_Something(x)
,然后解包方法名,而不是只调用
c.do('Something',x)

在任何情况下,处理未找到的属性都非常容易:

class Dispatcher(object):
    def __getattr__(self, key):
       try:
           return object.__getattr__(self, key)
       except AttributeError:
           return self.dispatch(key)

    def default(self, *args, **kw):
        print "Assuming default method"
        print args, kw

    def dispatch(self, key):
        print 'Looking for method: %s'%(key,)
        return self.default
测试:

>>> d = Dispatcher()
>>> d.hello()
Looking for method: hello
Assuming default method
() {}

这似乎充满了“gotchas”——getattr返回的东西将被假定为不仅仅是一个函数,而是该实例上的一个绑定方法。所以一定要把它还给我

您需要在对象上定义它

请注意,对于任何失败的查找都会调用getattr,并且您不会像获取函数一样获取它,因此您必须返回将被调用的方法

def __getattr__(self, attr):
  def default_method(*args):
    self.apply(attr, *args)
  return default_method

我最近确实这样做了。下面是我如何解决这个问题的一个例子:

class Example:
    def FUNC_1(self, arg):
        return arg - 1

    def FUNC_2(self, arg):
        return arg - 2

    def decode(self, func, arg):
        try:
            exec( "result = self.FUNC_%s(arg)" % (func) )
        except AttributeError:
            # Call your default method here
            result = self.default(arg)

        return result

    def default(self, arg):
        return arg
以及输出:

>>> dude = Example()
>>> print dude.decode(1, 0)
-1
>>> print dude.decode(2, 10)
8
>>> print dude.decode(3, 5)
5

那太可怕了。您可以改用getattr:
result=getattr(self,“FUNC\ud”%FUNC,self.default)(arg)
>>> dude = Example()
>>> print dude.decode(1, 0)
-1
>>> print dude.decode(2, 10)
8
>>> print dude.decode(3, 5)
5