2009-09-14 10 views
7

यदि मैं मॉड्यूल/कक्षा का उपयोग कर रहा हूं, तो मेरा कोई नियंत्रण नहीं है, मैं तरीकों में से एक को कैसे सजाना चाहूंगा?मैं किसी मौजूदा ऑब्जेक्ट विधि में सजावट कैसे जोड़ सकता हूं?

मुझे समझ में आता है कि मैं कर सकता हूं: my_decorate_method(target_method)() लेकिन मुझे ऐसा लगता है कि target_method को खोज/प्रतिस्थापन के बिना बुलाया जाता है।

क्या यह भी संभव है?

उत्तर

3

हाँ यह संभव है, लेकिन कई समस्याएं हैं। पहला पहिया आपको क्लास से स्पष्ट तरीके से विधि प्राप्त करता है, आपको एक वार्पर ऑब्जेक्ट मिलता है लेकिन फ़ंक्शन स्वयं ही नहीं।

class X(object): 
    def m(self,x): 
     print x 

print X.m   #>>> <unbound method X.m> 
print vars(X)['m'] #>>> <function m at 0x9e17e64> 

def increase_decorator(function): 
    return lambda self,x: function(self,x+1) 

दूसरा मैं अगर सेटिंग्स नई विधि हमेशा काम करेंगे पता नहीं है:

x = X() 
x.m(1)   #>>> 1 
X.m = increase_decorator(vars(X)['m']) 
x.m(1)   #>>> 2 
7

ऐसा मत करो।

विरासत का उपयोग करें।

import some_module 

class MyVersionOfAClass(some_module.AClass): 
    def someMethod(self, *args, **kwargs): 
     # do your "decoration" here. 
     super(MyVersionOfAClass, self). someMethod(*args, **kwargs) 
     # you can also do "decoration" here. 

अब, आप MyVersionOfAClass बजाय some_module.AClass उपयोग करने के लिए मुख्य कार्यक्रम तय।

+1

यह मूल तरीका था जिस पर मैंने समस्या को देखा लेकिन यह बहुत काम था। स्वीकार्य उत्तर में विधि जानना उपयोगी है - भले ही यह चीजों को करने का सबसे सही तरीका न हो। –

+1

"पठनीय" और "रखरखाव" के मामले में यह "अधिक सही" का मामला नहीं है। आपका उपयोग केस * सटीक * कारण है कि ओओ भाषाओं में विरासत है। यह बहुत सारे काम के रूप में दिखाई दे सकता है, लेकिन यह हर दूसरे प्रोग्रामर को देखने की उम्मीद है। लंबे समय तक, मजाकिया गतिशील सजावट एक देयता है। सादा पुरानी विरासत देयता नहीं बन जाएगी। –

संबंधित मुद्दे