2011-11-30 19 views
21

"पायथन सजावट" और "सजावटी पैटर्न" के बीच क्या अंतर है?पायथन सजावट और सजावटी पैटर्न के बीच क्या अंतर है?

मुझे पाइथन सजावट का उपयोग कब करना चाहिए, और मुझे सजावटी पैटर्न का उपयोग कब करना चाहिए?

मैं पाइथन सजावट और सजावटी पैटर्न के उदाहरणों को देख रहा हूं?


@AcceptedAnswer
मुझे पता है कि Jakob Bowyer's answer मान्य है। फिर भी स्ट्राइकर का जवाब है जिसने मुझे समझ लिया कि क्यों।


श्रीकर के जवाब के बाद और दिए गए संसाधनों का अध्ययन करने के बाद मैंने यह उदाहरण लिखा है, इसलिए मैं पाइथन सजावट और सजावटी पैटर्न को कल्पना और समझ सकता हूं।

मैं चाहिए असहमत Strikar के साथ "अजगर सज्जाकार डेकोरेटर पैटर्न के एक कार्यान्वयन नहीं हैं"। जो मैंने सीखा है उसके बाद मुझे दृढ़ विश्वास है कि पायथन सजावट सजावटी पैटर्न के कार्यान्वयन हैं। बस क्लासिक तरीके से नहीं।

इसके अलावा, मैं जोड़ने के लिए है कि तथ्य यह है Strikar ने कहा कि बावजूद "अजगर सज्जाकार कार्यक्षमता कार्य करता है और तरीकों की परिभाषा समय में जोड़ें" की जरूरत है आप आसानी से रन टाइम पर Pytohon सज्जाकार उपयोग कर सकते हैं।

फिर भी, मैं अभी भी स्वीकार किए जाते हैं के रूप में Stiker के जवाब निशान क्योंकि यह मुझे अजगर में डेकोरेटर पैटर्न का Implementationसमझने में मदद की।

""" 
Testing Python decorators against Decorator Pattern 
""" 
def function(string): 
    return string 

def decorator(wrapped): 
    def wrap(string): 
     # assume that this is something useful 
     return wrapped(string.upper()) 
    return wrap 

def method_decorator(wrapped): 
    def wrap(instance, string): 
     # assume that this is something useful 
     return wrapped(instance, string.upper()) 
    return wrap 

@decorator 
def decorated_function(string): 
    print('! '.join(string.split(' '))) 

class Class(object): 
    def __init__(self): 
     pass 
    def something_useful(self, string): 
     return string 

class Decorator(object): 
    def __init__(self, wrapped): 
     self.wrapped = wrapped 
    def something_useful(self, string): 
     string = '! '.join(string.split(' ')) 
     return self.wrapped().something_useful(string) 

    @method_decorator 
    def decorated_and_useful(self,string): 
     return self.something_useful(string) 


if __name__ == '__main__': 
    string = 'Lorem ipsum dolor sit amet.' 
    print(function(string))     # plain functioon 
    print(decorator(function)(string))  # Python decorator at run time 
    print(decorated_function(string))  # Python decorator at definition time 
    a = Class() 
    print(a.something_useful(string))  # plain method 
    b = Decorator(Class) 
    print(b.something_useful(string))  # Decorator Pattern 
    print(b.decorated_and_useful(string)) # Python decorator decorated Decorator Pattern 
+1

@ श्रीकर सही है। [यहां] (http://stackoverflow.com/q/3118929/146792) एक और एसओ सवाल है कि आपको दिलचस्प लग सकता है! – mac

+1

@ श्रीकर, मैं स्नसर को स्वीकार नहीं कर सकता जो प्रश्न में माफ की गई समस्या का समाधान नहीं करता है, क्षमा करें, लेकिन मेरे प्रश्नों में प्रस्तावित समाधानों में से अधिकांश काम नहीं कर रहे हैं। – seler

+0

@seler मेला पर्याप्त है। [पायथन सजावट] (http://en.wikipedia.org/wiki/Python_syntax_and_semantics#Decorators) पर विकिपीडिया लेख के अनुसार –

उत्तर

24

सजावटी पैटर्न - ऑब्जेक्ट उन्मुख प्रोग्रामिंग में, सजावटी पैटर्न एक डिज़ाइन पैटर्न है जो व्यवहार को मौजूदा ऑब्जेक्ट में गतिशील रूप से जोड़ने की अनुमति देता है। सजावटी पैटर्न का उपयोग उसी समय के अन्य उदाहरणों के स्वतंत्र रूप से रन-टाइम पर किसी निश्चित वस्तु की कार्यक्षमता को बढ़ाने (सजाने) के लिए किया जा सकता है, बशर्ते डिजाइन समय पर कुछ आधारभूत कार्य किया जाए।

पायथन में सजावटी - नाम के बावजूद, पायथन सजावट सजावटी पैटर्न का कार्यान्वयन नहीं कर रहे हैं। सजावटी पैटर्न एक डिजाइन पैटर्न है जो स्थिर टाइप टाइप ऑब्जेक्ट-उन्मुख प्रोग्रामिंग भाषाओं में उपयोग किया जाता है ताकि कार्यक्षमता को रन टाइम पर ऑब्जेक्ट्स में जोड़ा जा सके; पायथन सजावट परिभाषा समय पर कार्यों और विधियों के लिए कार्यक्षमता जोड़ते हैं, और इस प्रकार सजावटी-पैटर्न वर्गों की तुलना में उच्च स्तरीय निर्माण होते हैं। सजावट पैटर्न खुद पाइथन में मामूली रूप से कार्यान्वित करने योग्य है, क्योंकि भाषा बतख टाइप की जाती है, और इसलिए आमतौर पर ऐसा नहीं माना जाता है। तो पायथन में एक सजावटी कोई कॉल करने योग्य पायथन ऑब्जेक्ट है जिसका उपयोग फ़ंक्शन, विधि या श्रेणी परिभाषा को संशोधित करने के लिए किया जाता है।

मुझे उम्मीद है कि मैंने अंतर स्पष्ट कर दिया है। अगर आप पूरी तरह से समझ में नहीं आते हैं, तो कृपया इन लिंक के माध्यम से जाएं।

How to make a chain of function decorators?

Implementing the decorator pattern in Python

What is the difference between using decorators and extending a sub class by inheritance?

Python Class Decorator

PyWiki - Python Decorators - A detailed discourse

Python Decorators Made Easy

- आप इसे के अंत में स्पष्ट की तुलना में अधिक बाहर आ जाएगा

source1 & source2

+0

आप संपादित प्रश्न देखना चाहते हैं। – seler

0

अजगर में सजावटी सजावटी डिजाइन में सजावट का उपयोग कर रहे हैं। वे वही बात हैं जो कोई भाषा कार्यान्वयन और डिजाइन और कंप्यूटर विज्ञान अवधारणा के बारे में बात कर रहा है।

+0

नहीं यहां देखें http://wiki.python.org/moin/DecoratorPattern – Freelancer

1

अंतर यह है:

(क) अजगर सज्जाकार एक मौजूदा विधि से बंधा है और कहा कि विधि का व्यवहार बदलने के कर रहे हैं। उदाहरण:

@modifyBehavior 
def original(myString): 
    print myString 

मूल का व्यवहार ओवरराइट किया गया है। आप नई कार्यक्षमता जोड़ने के लिए इसका उपयोग नहीं कर सकते हैं।

(बी) सजावटी पैटर्न polymorphism के बारे में है। उपरोक्त आपके नमूना कोड में, Decorator.something_useful का व्यवहार ओवरराइट किया गया है। मूल विधि खो गई है। यह वास्तव में सजावटी पैटर्न नहीं है। आपको किसी विधि को प्रतिस्थापित नहीं करने के लिए कार्यक्षमता को बढ़ाने या जोड़ने की तलाश करनी चाहिए। आपको यह सुनिश्चित करना चाहिए कि a.something_useful (स्ट्रिंग) b.something_useful (स्ट्रिंग) जैसी ही चीज़ लौटाता है। वास्तव में, सजावटी पैटर्न में आप आम तौर पर मूल वस्तु को प्रतिस्थापित करेंगे। यहां मेरा मतलब है:

class Class(object): 
    def __init__(self): 
     pass 
    def something_useful(self, string): 
     return string 

class Decorator(object): 
    def __init__(self, wrapped): 
     self._wrapped = wrapped 
    def withUnderscores(self, string): 
     return '_'.join(string.split(' ')) 
    def __getattr__(self, name): 
     return getattr(self._wrapped, name) 


if __name__ == '__main__': 
    string = 'Lorem ipsum dolor sit amet.' 
    obj = Class() 
    print('Original: ', obj.something_useful(string)) 
    #This has no underscore function. Use decorator to add. 
    obj = Decorator(obj) 
    print('Replaced spaces: ', obj.withUnderscores(string)) 
    print('Original still works: ', obj.something_useful(string)) 

आपके पास कार्यक्षमता जोड़ने के लिए कई सजावटी हो सकते हैं। इससे आपको केवल वही जोड़ना पड़ता है जब आपको इसकी आवश्यकता होती है। अधिक पढ़ना: GoF

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