2012-06-06 23 views
8

संभव डुप्लिकेट:
What is the difference between @staticmethod and @classmethod in Python?पायथन स्टेटिक तरीकों, क्यों?

मैं कक्षाओं में staticmethods के बारे में कुछ प्रश्न हैं। मैं एक उदाहरण देकर शुरू करूंगा।

उदाहरण एक:

class Static: 
    def __init__(self, first, last): 
     self.first = first 
     self.last = last 
     self.age = randint(0, 50) 
    def printName(self): 
     return self.first + self.last 
    @staticmethod 
    def printInfo(): 
     return "Hello %s, your age is %s" % (self.first + self.last, self.age) 

x = Static("Ephexeve", "M").printInfo() 

आउटपुट:

Traceback (most recent call last): 
    File "/home/ephexeve/Workspace/Tests/classestest.py", line 90, in <module> 
    x = Static("Ephexeve", "M").printInfo() 
    File "/home/ephexeve/Workspace/Tests/classestest.py", line 88, in printInfo 
    return "Hello %s, your age is %s" % (self.first + self.last, self.age) 
NameError: global name 'self' is not defined 

उदाहरण दो:

class Static: 
    def __init__(self, first, last): 
     self.first = first 
     self.last = last 
     self.age = randint(0, 50) 
    def printName(self): 
     return self.first + self.last 
    @staticmethod 
    def printInfo(first, last, age = randint(0, 50)): 
     print "Hello %s, your age is %s" % (first + last, age) 
     return 

x = Static("Ephexeve", "M") 
x.printInfo("Ephexeve", " M") # Looks the same, but the function is different. 

आउटपुट

Hello Ephexeve M, your age is 18 

मैं देख रहा हूँ मैं एक staticmethods में किसी भी self.attribute फोन नहीं कर सकते हैं, मैं सिर्फ सच में जब और यह कारण है कि उपयोग करने के लिए यकीन नहीं है। मेरे मन में, यदि आप कुछ जिम्मेदार ठहराया के साथ एक वर्ग बनाने के लिए, शायद आप उन्हें बाद में उपयोग करने के लिए, और एक staticmethod जहां सभी विशेषताओं प्रतिदेय नहीं कर रहे हैं नहीं चाहते हैं। कोई भी मुझे यह समझा सकता है? पायथन मेरा पहला प्रोग्रामिंग लैंगंज है, इसलिए यदि जावा में यह वही है उदाहरण के लिए, मुझे नहीं पता।

+0

बंद करने के लिए वोट करने के लिए नफरत है, लेकिन सवाल मैं करने के लिए लिंक करने के बाद में जवाब काफी अच्छा कर रहे हैं। ध्यान दें कि '@ classmethod' जावा' स्थिर 'के समान है। '@ staticmethod' बहुत बेकार है। –

+0

धन्यवाद जोश, शायद मैंने ठीक से खोज नहीं की है, लिंक के लिए धन्यवाद, अब जांच करेगा –

उत्तर

8

आपको लगता है कि staticmethod साथ प्राप्त करने के लिए कोशिश कर रहे हैं? यदि आप नहीं जानते कि यह क्या करता है तो आप अपनी समस्या को हल करने की उम्मीद कैसे कर रहे हैं?

या फिर आप को देखने के लिए क्या staticmethod करता है के आसपास खेल रहे हैं? उस मामले में, यह शायद read the docs करने के लिए कहा जा करने के लिए यह क्या करता है, बेतरतीब ढंग से इसे लागू करने और व्यवहार यह क्या करता है से लगता है की कोशिश कर के बजाय और अधिक उत्पादक होगा।

किसी भी मामले में, एक कक्षा में एक समारोह परिभाषा को @staticmethod लागू करने के लिए एक "स्थिर विधि" बनाता है। "स्टेटिक" दुर्भाग्य से प्रोग्रामिंग में सबसे भ्रमित अधिभारित शब्दों में से एक है; यहां इसका मतलब है कि विधि पर निर्भर नहीं करता या ऑब्जेक्ट की राज्य बदल देते हैं। अगर मेरे पास foo कक्षा Bar में परिभाषित एक स्थिर विधि है, तो bar.foo(...) पर कॉल करें (जहां bar कक्षा Bar वर्ग का कुछ उदाहरण है) bar के गुणों के बावजूद बिल्कुल वही काम करेगा। वास्तव में मैं इसे कक्षा से सीधे Bar.foo(...) के रूप में कॉल कर सकता हूं जब मेरे पास कोई उदाहरण भी नहीं है!

यह केवल स्थिर विधि में उदाहरण गुजर नहीं द्वारा हासिल की है, इस प्रकार स्थिर तरीकों कोई self पैरामीटर की है।

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