Python uuu getattribute uuu(或uuu getattr uuu)来模拟php调用
我想创建一个有效地实现这一点的类(将一点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)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
在本例中_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