2012-08-01 10 views
8

यह एक अकादमिक प्रश्न है, एक व्यावहारिक से अधिक। मैं पाइथन की नींव में जाने की कोशिश कर रहा हूं, और मुझे आश्चर्य है: क्या मैं चाहता हूं कि मैं पाइथन में staticmethod और classmethod सजावटी को कार्यान्वित कर सकता हूं?शुद्ध पायथन में staticmethod और classmethod सजावट लागू किया जा सकता है?

staticmethod के लिए शायद मैं मूल कार्य का संदर्भ रख सकता हूं और इसे पहले तर्क को छोड़कर कह सकता हूं?

classmethod के लिए शायद मैं मूल कार्य का संदर्भ रख सकता हूं और इसे तर्क के बजाए पहले तर्क के प्रकार को पारित कर सकता हूं? (मैं इसे कक्षा में सीधे कहलाता हूं?)

फिर, ऐसा नहीं है कि मैं वास्तव में इसे अपने कार्यक्रमों में लागू करना चाहता हूं; मैं सीखना चाहता हूं कि भाषा इससे कैसे काम करती है। यदि ऐसा करना संभव है तो मैं वास्तव में कोड नमूने की सराहना करता हूं। यदि नहीं, तो मैं स्पष्टीकरण की सराहना करता हूं कि इसे सैद्धांतिक रूप से क्यों नहीं किया जा सकता है। धन्यवाद!

संपादित करें: उत्तर के लिए धन्यवाद और वर्णनकर्ता प्रोटोकॉल के संदर्भ के लिए धन्यवाद!

  • यह किया जा सकता है __ कॉल __ हमारे कक्षाओं में विशेष विधि को लागू करने से उदाहरण के लिए, वर्णनकर्ता प्रोटोकॉल के बिना: एक साधन के आगे अजगर की मेरी समझ का विस्तार करने के रूप में मैं दो और बातें पूछना चाहते हैं?

  • क्या वर्णनकर्ता प्रोटोकॉल पायथन 2.7 और पायथन 3.x में समान तरीके से काम करता है?

धन्यवाद फिर से!

उत्तर

10

वहाँ the docs में उदाहरण हैं:

class StaticMethod(object): 
    "Emulate PyStaticMethod_Type() in Objects/funcobject.c" 

    def __init__(self, f): 
     self.f = f 

    def __get__(self, obj, objtype=None): 
     return self.f 

और:

class ClassMethod(object): 
    "Emulate PyClassMethod_Type() in Objects/funcobject.c" 

    def __init__(self, f): 
     self.f = f 

    def __get__(self, obj, klass=None): 
     if klass is None: 
      klass = type(obj) 
     def newfunc(*args): 
      return self.f(klass, *args) 
     return newfunc 
+0

मैं इस उत्तर को स्वीकार करने जा रहा हूं, क्योंकि यह मेरे मूल प्रश्न का एक अच्छा और पूर्ण उत्तर है। हालांकि, अगर आप मेरे संपादन का जवाब भी देते हैं तो मैं इसकी बहुत सराहना करता हूं! धन्यवाद! – Tom

1

के बाद से यह आपके सवाल का सीधे जवाब देती है आप, जेएफ सेबेस्टियन के जवाब को स्वीकार करना चाहिए, लेकिन यह सवाल पूछने के बारे में आप जानना चाहते हैं इसका मतलब है वर्णनकर्ता प्रोटोकॉल जिसे आप here के बारे में पढ़ सकते हैं, जो इन और अन्य महत्वपूर्ण पायथन इंटर्नल्स को लागू करने के लिए उपयोग की जाने वाली चीज है (और जब आप कम से कम उपयोग करते हैं तो अपने कोड में उपयोगी हो सकते हैं)। property, और नियमित ओएल 'बाध्य विधियां अन्य चीजें हैं जो वर्णनकर्ता प्रोटोकॉल का उपयोग करके लिखी जाती हैं।

आपको इसे देखना चाहिए, जब आप इसे पहले पढ़ते हैं तो यह इतना आसान नहीं है, लेकिन यह क्लिक करेगा।

+0

लिंक और स्पष्टीकरण के लिए धन्यवाद! कृपया मेरा संपादन देखें। – Tom

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