2011-07-14 50 views
0

我有類:通過裝飾器重新定義或添加方法到類。可能?

@custom_decorator 
class Creature(objects): 

    def __init__(self): 
     pass 

    def rise_hands(self, *args, **kwargs): 
     print 'hands rised' 

我要定義這個類生物的頂部定製的裝飾,使之重新定義或添加新的方法,該方法rise_hands

順便說一句:我如何重新定義值argskwargs

UPDATE:

的戈拉情況如下: 我想實現與裝飾的Django模型的應用程序。無論我在模型上如何定義它,它都會記錄更改,通過保存舊值和新值curten字段...

+0

...以及爲什麼要混淆你的代碼? – Gerrat

+1

「通過保存某些字段的舊值和新值來記錄更改」。這就是Django'pre_save'信號的用途。 –

回答

1

不要。做。這個。

你有繼承來完成你正在談論的內容。

class FancyCreature(Creature): 

    def __init__(self): 
     super(FancyCreature, self).__init___() 

    def rise_hands(self, *args, **kwargs): 
     print 'hands rised' 
     super(FancyCreature, self).rise_hands(*args, **kwargs) 

    def new_method(self): 
     print "new method" 

這是你「重新定義方法rise_hands或添加新的方法」

+0

在Python 3中,您可以簡單地在類中使用'super()。[method]'而不是傳遞類名和'self'。 – JAB

+0

我知道,但在我的情況下,我想重新定義django模型保存方法的行爲或重新定義域的getters每次更改時記錄舊值和新值...或類似的東西:) – Pol

0

方式下面是如何在kwargs和args修改參數。原則上這樣做我沒有看到任何錯誤

>>> def go(func,*args,**kwargs): 
...  def g(*args,**kwargs): 
...    func(args+(1,),kwargs) 
...  return g 
... 

>>> @go 
... def rise_hands(*args, **kwargs): 
...  print args 
... 
>>> rise_hands(1) 
((1, 1), {})