एक उपयोग केस जो मैं सोच सकता हूं वह है यदि आप चाहते हैं एक वर्ग के सभी तरीकों को लपेटो एक समारोह सजावट के साथ।
def logit(f):
def res(*args, **kwargs):
print "Calling %s" % f.__name__
return f(*args, **kwargs)
return res
और निम्न वर्ग:
>>> class Pointless:
def foo(self): print 'foo'
def bar(self): print 'bar'
def baz(self): print 'baz'
>>> p = Pointless()
>>> p.foo(); p.bar(); p.baz()
foo
bar
baz
आप सभी तरीकों को सजाने कर सकते हैं:
>>> class Pointless:
@logit
def foo(self): print 'foo'
@logit
def bar(self): print 'bar'
@logit
def baz(self): print 'baz'
>>> p = Pointless()
>>> p.foo(); p.bar(); p.baz()
Calling foo
foo
Calling bar
bar
Calling baz
baz
लेकिन वह लंगड़ा है आप निम्नलिखित डेकोरेटर है की शुभकामनाएं दें! इसके बजाय आप यह कर सकते हैं:
>>> def logall(cls):
for a in dir(cls):
if callable(getattr(cls, a)):
setattr(cls, a, logit(getattr(cls, a)))
return cls
>>> @logall
class Pointless:
def foo(self): print 'foo'
def bar(self): print 'bar'
def baz(self): print 'baz'
>>> p = Pointless()
>>> p.foo(); p.bar(); p.baz()
Calling foo
foo
Calling bar
bar
Calling baz
baz
अद्यतन: logall
का एक और अधिक जेनेरिक वर्जन:
>>> def wrapall(method):
def dec(cls):
for a in dir(cls):
if callable(getattr(cls, a)):
setattr(cls, a, method(getattr(cls, a)))
return cls
return dec
>>> @wrapall(logit)
class Pointless:
def foo(self): print 'foo'
def bar(self): print 'bar'
def baz(self): print 'baz'
>>> p = Pointless()
>>> p.foo(); p.bar(); p.baz()
Calling foo
foo
Calling bar
bar
Calling baz
baz
>>>
पूर्ण प्रकटीकरण: मैं यह करने के लिए किया था कभी नहीं किया है और मैं सिर्फ इस उदाहरण बना हुआ है।
@Manoj, खुशी है कि आपको यह पसंद आया, मुझे बताए जाने के लिए टीएक्स! –