2009-10-26 25 views
2

我想創建一個類,有效地做到這一點(混合了一點PHP和Python)的Python __getattribute__(或__getattr__)來模擬PHP __call

 
    class Middle(object) : 
    # self.apply is a function that applies a function to a list 
    # e.g self.apply = [] ... self.apply.append(foobar)  
    def __call(self, name, *args) : 
     self.apply(name, *args) 

因此允許代碼的說:

 
    m = Middle() 
    m.process_foo(a, b, c) 

在這種情況下,__call()是在對象上找不到方法時調用的PHP __call()方法。

回答

3

您需要在您的對象上定義__getattr__,它is called if an attribute is not otherwise found

請注意,getattr是針對任何失敗的查找而調用的,並且您沒有像所有函數那樣獲取它,因此您必須返回將被調用的方法。

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

考慮將參數作爲參數傳遞給您的方法,而不是將其編碼爲方法名稱,然後將其作爲參數神奇地使用。

你在哪裏寫代碼,不知道它會調用什麼方法?

爲什麼打電話給c.do_Something(x),然後解開方法名稱而不是僅僅調用c.do('Something', x)

在任何情況下,它是很容易處理unfound屬性:

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 
() {} 

這似乎是充滿了 「陷阱」 - 事情由GETATTR返回將被假定爲不僅僅是一個函數,而是該實例的一個綁定方法。所以一定要回報。

-1

我最近真的這麼做了。下面是我如何解決它的例子:

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 
+1

這是絕對可怕。你可以使用getattr代替:'result = getattr(self,「FUNC_%d」%func,self.default)(arg)' – u0b34a0f6ae 2009-10-26 19:14:16

相關問題