2009-06-02 13 views
11

मैंने कई उदाहरणों में देखा है कि मैं इस तरह की चीजें देखता हूं:पायथन में @ प्रतीकों का उद्देश्य?

# Comments explaining code i think 
@innerclass 

या:

def foo(): 
""" 
Basic Doc String 
""" 
@classmethod 

गूगलिंग मुझे यह बहुत सामान्य नहीं है, यह सिर्फ एक सामान्य परिभाषा है। इसके अलावा मैं वास्तव में अजगर दस्तावेज में कुछ भी नहीं ढूंढ सकता।

ये क्या करते हैं?

+0

@uberjumper जाएगा - अगर आपको लगता है कि हम दोनों इसके लायक हैं तो आपको अभिनव का जवाब देना चाहिए। मुझे अपने ब्लॉग पर कुछ मुफ्त ट्रैफिक मिला है और उनके पास उनके मुकाबले कम प्रतिनिधि है। –

उत्तर

10

वे सजावटी हैं।

<shameless plug> मेरे पास इस विषय पर blog post है। </shameless plug>

+2

आपका लापरवाह प्लग, एक बेहद अच्छी तरह से लिखित और स्पष्ट लेख था। – UberJumper

4
साथ

@function 
def f(): 
    pass 

आप बस f() आसपास function लपेट दें। function को एक सजावटी कहा जाता है।

def f(): 
    pass 
f=function(f) 
+0

मुझे यह जवाब पसंद है, छोटे और स्पष्ट +1 – Patric

21

वे कहा जाता है सज्जाकार:

यह निम्न के लिए बस वाक्यात्मक चीनी है। वे अन्य कार्यों पर लागू कार्यों हैं। यहां एक समान प्रश्न के उत्तर की एक प्रति है।

पायथन सजावटी दूसरे फ़ंक्शन में अतिरिक्त कार्यक्षमता जोड़ते हैं। एक इटैलिक डेकोरेटर की तरह

def makeitalic(fn): 
    def newFunc(): 
     return "<i>" + fn() + "</i>" 
    return newFunc 

नोट हो सकता है कि एक समारोह में एक समारोह के अंदर परिभाषित किया गया है। यह मूल रूप से क्या करता है एक नए कार्यों के साथ एक समारोह को प्रतिस्थापित करता है। उदाहरण के लिए, मेरे पास यह कक्षा

class foo: 
    def bar(self): 
     print "hi" 
    def foobar(self): 
     print "hi again" 

अब कहें, मैं चाहता हूं कि वे दोनों कार्य करने के बाद और बाद में "---" प्रिंट करें। मैं प्रत्येक प्रिंट स्टेटमेंट के पहले और बाद में एक प्रिंट "---" जोड़ सकता था। लेकिन क्योंकि मैं अपने आप को दोहरा पसंद नहीं है, मैं एक डेकोरेटर

def addDashes(fn): # notice it takes a function as an argument 
    def newFunction(self): # define a new function 
     print "---" 
     fn(self) # call the original function 
     print "---" 
    return newFunction 
    # Return the newly defined function - it will "replace" the original 

तो अब मैं

class foo: 
    @addDashes 
    def bar(self): 
     print "hi" 

    @addDashes 
    def foobar(self): 
     print "hi again" 

सज्जाकार अधिक जानकारी के लिए करने के लिए मेरी कक्षा बदल सकते हैं बनाने के लिए, जाँच http://www.ibm.com/developerworks/linux/library/l-cpdecor.html

+3

मैं चाहता हूं कि मैं दो लोगों को स्वीकार्य समाधान दे सकूं। :( – UberJumper

+1

एफवाईआई - दूसरा उत्तर यहां है: http://stackoverflow.com/questions/739654/understanding-python-decorators/739667#739667 –

+0

और अगर आपको डॉन 'जोड़ने के लिए' fn 'तर्क की भी आवश्यकता क्यों है, टी इसका उपयोग नहीं करते? – wordsforthewise

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