2015-12-10 47 views
3

比方說,我想延長以下Python類,其中包括一個裝飾,我不知道很多有關:如何覆蓋Python中的裝飾方法?

from somewhere import some_decorator 

class One(object): 
    @some_decorator 
    def some_method(self): 
     do_something() 

我應該裝飾覆蓋的方法或沒有?換句話說,我可以放心地做:

class Two(One): 
    def some_method(self): 
     super(Two, self).some_method() 

或者我需要做的:

class Two(One): 
    @some_decorator 
    def some_method(self): 
     super(Two, self).some_method() 

回答

4

記住什麼@decorator語法確實:

@decorator 
def foo(): 
    print "foo" 

只是語法糖
def foo(): 
    print "foo" 
foo = decorator(foo) 

因此,th未裝飾的功能在裝飾後不再可以通過其名稱進行調用,因爲其名稱已分配給其他名稱。

這意味着當您在子類中調用super(Two, self).some_method()時,父類中的裝飾函數some_method將被調用。

知道你是否還需要裝飾孩子重寫方法完全取決於你想要做什麼和裝飾者做什麼。但是要知道,如果您致電super(Two, self).some_method(),那麼您將調用裝飾函數。

+0

完美答案,謝謝! – seddonym