पायथन में स्थिर तरीकों का उपयोग करने का क्या फायदा है?


90

मैं कोड के साथ अजगर में अनबाउंड विधि त्रुटि में भाग गया

import random

class Sample(object):
'''This class defines various methods related to the sample'''

    def drawSample(samplesize,List):
        sample=random.sample(List,samplesize)
        return sample

Choices=range(100)
print Sample.drawSample(5,Choices)

यहां कई सहायक पोस्ट पढ़ने के बाद, मुझे लगा कि @staticmethodकोड को काम करने के लिए मैं ऊपर कैसे जोड़ सकता हूं । मैं एक अजगर नौसिखिया हूं। क्या कोई कृपया बता सकता है कि कोई व्यक्ति स्थिर विधियों को क्यों परिभाषित करना चाहेगा? या, सभी विधियों को स्थिर विधियों के रूप में क्यों नहीं परिभाषित किया गया है?


1
यह एक अजीब सवाल है। स्थैतिक तरीके एक डिजाइन की आवश्यकता है । यह एक "लाभ" बात नहीं है। आप उनका उपयोग करते हैं क्योंकि आपको अवश्य करना चाहिए। यह स्थिर तरीकों के लिए एक वर्ग की एक डिजाइन सुविधा है। क्या आप पूछ रहे हैं कि पहली जगह में कौन से स्थिर तरीके हैं? मुझे लगता है कि प्रश्न को अधिक स्पष्ट रूप से परिभाषित किया जा सकता है जिसे आपको जानना आवश्यक है।
एल

15
नहीं, मैं नहीं जानना चाहता था कि वे क्या हैं। जो मैं जानना चाहता था, वह "आवश्यकता" क्यों थी, जो दूसरों द्वारा दिए गए उत्तरों से स्पष्ट हो गई है। यह तब है जब आप इसे गैर-स्थैतिक तरीकों के बजाय परिभाषित करेंगे। धन्यवाद।
जिज्ञासु २

3
@ S.Lott: जब एक सामान्य वर्ग विधि का उपयोग करने के लिए विरोध के रूप में एक staticmethod एक आवश्यकता का उपयोग कर रहा है? जहाँ तक मैं बता सकता हूँ, एक क्लास पद्धति सब कुछ एक स्टैटिकमेथोड कर सकती है। इस पोस्ट में अन्यत्र सूचीबद्ध के रूप में स्टैटिकमेथोड के "फायदे" हैं, लेकिन मैं किसी भी कारण से एक क्लास पद्धति का उपयोग किसी ऐसी जगह पर नहीं कर सकता हूं, जिसमें एक स्थिर विधि का उपयोग किया जा सके, इसलिए यह एक आवश्यकता है।
RFV

जवाबों:


128

स्टैटिक विधियों का सीमित उपयोग होता है, क्योंकि उनके पास एक वर्ग के उदाहरण की विशेषताओं तक पहुंच नहीं होती है (जैसे कि एक नियमित विधि होती है), और उनके पास कक्षा की विशेषताओं तक पहुंच नहीं होती है (जैसे क्लास पद्धति की तरह )।

इसलिए वे दिन-प्रतिदिन के तरीकों के लिए उपयोगी नहीं हैं।

हालांकि, वे एक वर्ग के साथ कुछ उपयोगिता फ़ंक्शन को समूहित करने के लिए उपयोगी हो सकते हैं - उदाहरण के लिए एक प्रकार से दूसरे में एक साधारण रूपांतरण - जो प्रदान किए गए मापदंडों के अलावा किसी भी जानकारी तक पहुंच की आवश्यकता नहीं है (और शायद मॉड्यूल के लिए कुछ विशेषताएं वैश्विक हैं। )

उन्हें कक्षा से बाहर रखा जा सकता है, लेकिन उन्हें कक्षा के अंदर समूहित करने से समझ में आ सकता है कि वे केवल वहीं लागू होते हैं।

आप मॉड्यूल नाम के बजाय उदाहरण या वर्ग के माध्यम से विधि का संदर्भ भी दे सकते हैं, जो पाठक को समझने में मदद कर सकता है कि विधि किस उदाहरण से संबंधित है।


8
@ Curious2learn: प्रत्येक नहीं , लेकिन कुछ विधियाँ स्थैतिक विधियों के रूप में उपयोगी हैं। एक उदाहरण Localeवर्ग के बारे में सोचें , जिनके उदाहरण स्थान (डुह) होंगे। इस getAvailableLocales()तरह के वर्ग की एक स्थिर विधि का एक अच्छा उदाहरण होगा: यह स्पष्ट रूप से लोकेल वर्ग से संबंधित है, जबकि स्पष्ट रूप से किसी विशेष उदाहरण से संबंधित नहीं है।
MestreLion

... और यह एक वर्ग विधि भी नहीं है, क्योंकि इसे किसी भी वर्ग के तरीकों तक पहुंचने की आवश्यकता नहीं हो सकती है।
MestreLion

एक संपादक बताता है कि एक स्थैतिक विधि क्लास विशेषताओं को एक्सेस कर सकती है , स्पष्ट रूप से नीचे से नेविगेट करके class_name.attribute, बस cls.attributeया नहीं self.attribute। यह "सार्वजनिक" विशेषताओं के लिए सही है। अधिवेशन के द्वारा, आपको इस तरह से, अंडरस्कोर या दो अंडरस्कोर के साथ मंगवाए गए नामों के साथ छिपी विशेषताओं का उपयोग नहीं करना चाहिए। इसका मतलब यह भी है कि जब वंशानुक्रम पदानुक्रम पर स्थान परिवर्तन करता है तो आपका कोड अधिक नाजुक होगा।
28

गुइदो का एक उद्धरण जो यह तय करने में मदद करता है कि स्टैटिकमेथोड्स (कभी नहीं) का उपयोग करने के लिए: "हम सभी जानते हैं कि स्थिर तरीके कितने सीमित हैं। (वे मूल रूप से एक दुर्घटना हैं - 2.2 दिनों में पाइथन में वापस जब मैं नई शैली की कक्षाओं और डिस्क्रिप्शन का आविष्कार कर रहा था। , मेरा मतलब था कि मैं क्लास के तरीकों को लागू करना चाहता था, लेकिन पहले तो मैंने उन्हें समझा नहीं और गलती से स्टैटिक तरीके लागू कर दिए। फिर उन्हें हटाने में बहुत देर हो गई और केवल क्लास के तरीके ही उपलब्ध कराए गए। "
बोरिस चुर्जिन

189

विस्तृत विवरण के लिए इस लेख को देखें ।

टी एल; डॉ

1.यह selfतर्क के उपयोग को समाप्त करता है।

2. यह मेमोरी के उपयोग को कम कर देता है क्योंकि पायथन को प्रत्येक वस्तु के लिए एक बाध्य विधि को तत्काल करने की आवश्यकता नहीं होती है:

>>>RandomClass().regular_method is RandomClass().regular_method
False
>>>RandomClass().static_method is RandomClass().static_method
True
>>>RandomClass.static_method is RandomClass().static_method
True

3. यह कोड पठनीयता में सुधार करता है, यह दर्शाता है कि विधि वस्तु की स्थिति पर निर्भर नहीं करती है।

4. यह उस तरीके को ओवरराइड करने की अनुमति देता है, यदि विधि को मॉड्यूल-स्तर पर परिभाषित किया गया था (अर्थात कक्षा के बाहर) एक उपवर्ग उस पद्धति को ओवरराइड करने में सक्षम नहीं होगा।


3
यह स्वीकृत उत्तर होना चाहिए। तथ्य यह है कि किसी भी उदाहरण और वर्ग पर स्थिर विधि एक ही वस्तु एक वास्तविक लाभ है, खासकर जब आपके पास बहुत सारे उदाहरण हैं (उदाहरण के लिए एक उत्परिवर्ती डेटाबेस रिकॉर्ड के लिए प्रत्येक उदाहरण)।
ज़ूयुन वी

+1 और @ZhuoyunWei से सहमत हैं। केवल इसका उत्तर है कि कुछ कारण बताते हैं कि एक स्थिर विधि कभी-कभी एक वर्ग विधि की तुलना में बेहतर होती है (हालांकि 1 और 3 वास्तव में समान कारण हैं)।
एलेक्स

1
"स्टैटिक मेथड क्यों" का सबसे अच्छा उत्तर, लेकिन मूल प्रश्न यह भी पूछा गया "सभी स्टैटिक स्टैटिक क्यों नहीं हैं?"। लघु "उदाहरण के लिए कोई विशेषता नहीं" भी शामिल किया जाएगा।
Exu

IMO एकमात्र वास्तविक लाभ यह है कि आप इसे एक उपवर्ग में ओवरराइड कर सकते हैं, लेकिन यहां तक ​​कि यह भी महसूस होता है कि आप कुछ गलत OOP- वार कर रहे हैं, आप किस उपयोग के मामले में ऐसा करेंगे?
बोरिस चुरज़िन

23

यह आपके वास्तविक प्रश्न के बिंदु पर काफी नहीं है, लेकिन जब से आपने कहा है कि आप एक अजगर नौसिखिया हैं तो शायद यह मददगार होगा, और कोई और काफी नहीं आया है और स्पष्ट रूप से कहा है।

मैंने विधि को एक स्थिर विधि बनाकर उपरोक्त कोड कभी तय नहीं किया होगा। मैंने या तो क्लास को डिसाइड किया और सिर्फ एक फंक्शन लिखा:

def drawSample(samplesize,List):
    sample=random.sample(List,samplesize)
    return sample

Choices=range(100)
print drawSample(5,Choices)

यदि आपके पास कई संबंधित कार्य हैं, तो आप उन्हें एक मॉड्यूल में समूहित कर सकते हैं - अर्थात, उन सभी को एक ही फ़ाइल में रखें, sample.pyउदाहरण के लिए नाम ; फिर

import sample

Choices=range(100)
print sample.drawSample(5,Choices)

या मैंने __init__कक्षा में एक विधि जोड़ी होगी और एक उदाहरण बनाया होगा जिसमें उपयोगी विधियाँ थीं:

class Sample(object):
'''This class defines various methods related to the sample'''

    def __init__(self, thelist):
        self.list = thelist

    def draw_sample(self, samplesize):
        sample=random.sample(self.list,samplesize)
        return sample

choices=Sample(range(100))
print choices.draw_sample(5)

(मैंने पीईपी 8. द्वारा सुझाई गई शैली से मेल खाने के लिए उपरोक्त उदाहरण में केस कन्वेंशनों को भी बदल दिया।)

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


टिप्पणी के लिए धन्यवाद। मुझे इस मामले में एक वर्ग की आवश्यकता थी क्योंकि मैं तैयार किए गए नमूने के साथ काम करना चाहता हूं। नहीं, मैंने एक स्थैतिक विधि का उपयोग नहीं किया, लेकिन मैं उस संदेश के बारे में जानना चाहता था, जब मुझे त्रुटि संदेश की जानकारी मिली थी। लेकिन एक वर्ग को परिभाषित किए बिना फ़ंक्शन को एक मॉड्यूल में इकट्ठा करने के बारे में आपकी सलाह अन्य कार्यों के लिए उपयोगी होगी जो मुझे चाहिए। तो धन्यवाद।
जिज्ञासु २

4
+1: ओपी की कुछ भ्रांतियों पर यह एक अच्छी व्याख्या थी। और आप बहुत ईमानदार थे, यह कहना, कि आप वास्तव में स्थैतिक तरीकों के बारे में उनके सवाल का जवाब नहीं दे रहे थे , लेकिन आपने बहुत बेहतर समाधान देते हुए कहा कि उनकी समस्या के लिए कक्षाओं की आवश्यकता नहीं है।
MestreLion

22

स्थैतिक विधियों को परिभाषित क्यों करना चाहेगा ?

मान लीजिए कि हमें एक है classकहा जाता है Mathतो

कोई भी नहीं की वस्तु बनाने के लिए चाहते हैं class Math
और फिर आह्वान तरह के तरीकों ceilऔर floorऔर fabsउस पर।

तो हम उन्हें बनाते हैं static

उदाहरण के लिए

>> Math.floor(3.14)

से बहुत बेहतर है

>> mymath = Math()
>> mymath.floor(3.14)

इसलिए वे किसी तरह से उपयोगी हैं। आपको उनका उपयोग करने के लिए किसी वर्ग का उदाहरण बनाने की आवश्यकता नहीं है।

सभी विधियों को स्थिर विधियों के रूप में परिभाषित क्यों नहीं किया गया है ?

वे उदाहरण चर तक पहुँच नहीं है।

class Foo(object):
    def __init__(self):
        self.bar = 'bar'

    def too(self):
        print self.bar

    @staticmethod
    def foo():
        print self.bar

Foo().too() # works
Foo.foo() # doesn't work

यही कारण है कि हम सभी विधियों को स्थिर नहीं बनाते हैं।


10
लेकिन एक पैकेज गणित क्यों नहीं? पायथन के पास इसके लिए पैकेज हैं, आपको नाम स्थान बनाने के लिए वर्ग परिभाषा की आवश्यकता नहीं है
extraneon

6
@extraneon: हाँ, मुझे पता है कि लेकिन मैं कुछ सरल और स्पष्टीकरण के लिए परिचित होना चाहता था इसलिए मैंने इस्तेमाल किया Math। इसीलिए मैंने पूंजी लगाई M
प्रतीक देवघर

6
ओपी ने यह नहीं पूछा कि स्थिर तरीके क्या हैं। उन्होंने पूछा कि उनका क्या फायदा है। आप उन्हें उपयोग करने का तरीका बता रहे हैं, न कि वे कैसे उपयोगी हैं। आपके विशेष उदाहरण में, एक नामस्थान अधिक समझ में आता है।
जेवियर

4
-1: अच्छी और सही व्याख्या, लेकिन बहुत खराब तरीके से चुना गया उदाहरण: आपके द्वारा किए गए किसी कारण के लिए Mathपहली जगह में एक कक्षा होने का कोई कारण नहीं है, एक मॉड्यूल एक बेहतर फिट होगा। एक वर्ग का उदाहरण खोजने की कोशिश करें जो एक वर्ग के रूप में समझ में आता है, न कि यह कि "कोई भी वस्तु का निर्माण नहीं करना चाहेगा"
MestreLion

3
और तब वर्गों के तरीकों में से एक (या कुछ ) के स्थिर उपयोग के लिए एक कानूनी उपयोग के मामले का उदाहरण दें , लेकिन सभी नहीं । यदि सभी वर्गों की विधियाँ स्थिर हैं, तो कक्षा एक मॉड्यूल होनी चाहिए। यदि कोई भी स्थिर नहीं है, तो आप प्रश्न का उत्तर नहीं दे रहे हैं।
MestreLion

13

जब आप किसी ऑब्जेक्ट ऑब्जेक्ट को ऑब्जेक्ट इंस्टेंस से कॉल करते हैं, तो यह एक 'बाउंड मेथड' बन जाता है और इंस्टेंस ऑब्जेक्ट को पहले तर्क के रूप में पास किया जाता है।

जब आप classmethodऑब्जेक्ट ऑब्जेक्ट (किसी फ़ंक्शन ऑब्जेक्ट को किसी ऑब्जेक्ट उदाहरण पर लपेटते हैं) को कॉल करते हैं , तो इंस्टेंस ऑब्जेक्ट का वर्ग पहले तर्क के रूप में पास हो जाता है।

जब आप किसी staticmethodऑब्जेक्ट को कहते हैं (जो किसी फ़ंक्शन ऑब्जेक्ट को लपेटता है), तो कोई निहित पहले तर्क का उपयोग नहीं किया जाता है।

class Foo(object):

    def bar(*args):
        print args

    @classmethod
    def baaz(*args):
        print args

    @staticmethod
    def quux(*args):
        print args

>>> foo = Foo()

>>> Foo.bar(1,2,3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unbound method bar() must be called with Foo instance as first argument (got int instance instead)
>>> Foo.baaz(1,2,3)
(<class 'Foo'>, 1, 2, 3)
>>> Foo.quux(1,2,3)
(1, 2, 3)

>>> foo.bar(1,2,3)
(<Foo object at 0x1004a4510>, 1, 2, 3)
>>> foo.baaz(1,2,3)
(<class 'Foo'>, 1, 2, 3)
>>> foo.quux(1,2,3)
(1, 2, 3)

3
+1: अंत में स्थैतिक विधियों और वर्ग विधियों के बारे में एक शानदार व्याख्या । यद्यपि आपने यह नहीं बताया कि कोई व्यक्ति कभी स्थिर विधि का उपयोग क्यों करना चाहता है, कम से कम आपने स्पष्ट उदाहरण में स्पष्ट किया कि दोनों आधिकारिक डॉक्स की तुलना में बहुत बेहतर हैं
MestreLion

3

स्थैतिक विधियां महान हैं क्योंकि आपको उस वस्तु का उदाहरण घोषित करने की आवश्यकता नहीं है जिसके लिए विधि संबंधित है।

अजगर की साइट पर स्थैतिक तरीकों पर कुछ महान दस्तावेज हैं:
http://docs.python.org/library/functions.html#staticmethod


धन्यवाद डेविड। लेकिन फिर हर पद्धति को एक स्थिर पद्धति के रूप में परिभाषित क्यों नहीं किया जाता है, क्योंकि वे उदाहरणों पर भी काम करती हैं। क्या ऐसा करने की कोई कमियां हैं?
क्यूरियस 2

4
@ Curious2learn: नहीं, स्थैतिक विधियों के साथ आपके पास उदाहरण के लिए कोई पहुँच नहीं है: उदाहरण को इसके वर्ग को छोड़कर अनदेखा किया गया है।
फेलिक्स क्लिंग

4
यह तर्क जावा में सही होगा, जहां फ़ंक्शन स्वयं नहीं रह सकते हैं लेकिन हमेशा एक वर्ग के संदर्भ में परिभाषित होते हैं। लेकिन पायथन में आपके पास फ़ंक्शंस और स्टैटिक क्लास फ़ंक्शंस हो सकते हैं। यह उत्तर वास्तव में यह नहीं दिखाता है कि किसी कक्षा में एक विधि के बजाय एक स्थिर विधि का चयन क्यों करना है।
extraneon

1
@extraneon - यह कोड संगठनात्मक वरीयताओं का एक मामला है; स्थैतिक विधियाँ होने से एक अतिरिक्त विकल्प मिलता है।
चार्ल्स डफी

@ फेलिक्स - धन्यवाद। यह स्पष्ट करता है कि प्रत्येक विधि एक स्थिर विधि क्यों नहीं होनी चाहिए।
जिज्ञासु २

3

एक के लिए विकल्प staticmethodहैं: classmethod, instancemethod, और function। यदि आप नहीं जानते कि ये क्या हैं, तो अंतिम अनुभाग तक स्क्रॉल करें। यदि staticmethodइनमें से किसी भी विकल्प से बेहतर है, तो यह इस बात पर निर्भर करता है कि यह किस उद्देश्य से लिखा गया है।

पायथन स्थिर विधि के लाभ

  • आप विशेषताओं या वर्ग या उदाहरण के तरीकों के लिए उपयोग की जरूरत नहीं है, एक staticmethodएक से बेहतर है classmethodया instancemethod। इस तरह यह स्पष्ट ( @staticmethodसज्जाकार से) है कि वर्ग 'और उदाहरण की स्थिति को पढ़ा या संशोधित नहीं किया गया है। हालांकि, functionउस अंतर का उपयोग स्पष्ट भी करता है (नुकसान देखें)।
  • एक की कॉल हस्ताक्षर staticmethodएक के समान ही है classmethodया instancemethod, अर्थात् <instance>.<method>(<arguments>)। इसलिए इसे आसानी से तीन में से एक द्वारा प्रतिस्थापित किया जा सकता है यदि बाद में या एक व्युत्पन्न वर्ग में इसकी आवश्यकता होती है। आप एक साधारण के साथ ऐसा नहीं कर सकते function
  • ए के staticmethodबजाय इसका उपयोग functionस्पष्ट करने के लिए किया जा सकता है कि यह विषयगत रूप से एक वर्ग से संबंधित है और नामस्थान संघर्ष को रोकने के लिए है।

पायथन स्थिर विधि के नुकसान

  • यह उदाहरण या वर्ग की विशेषताओं या विधियों तक नहीं पहुँच सकता।
  • एक की कॉल हस्ताक्षर staticmethodएक के समान ही है classmethodया instancemethod। यह इस तथ्य को मास्क करता है कि staticmethodवास्तव में किसी वस्तु की जानकारी को पढ़ता या संशोधित नहीं करता है। इससे कोड को पढ़ना मुश्किल हो जाता है। सिर्फ एक का उपयोग क्यों नहीं function?
  • staticmethodको फिर से उपयोग करना मुश्किल है यदि आपको कभी भी इसे कक्षा / उदाहरण के बाहर से कॉल करने की आवश्यकता होती है जहां इसे परिभाषित किया गया था। यदि पुन: उपयोग के लिए कोई संभावना है, तो एक functionबेहतर विकल्प है।
  • staticmethodशायद ही कभी इस्तेमाल किया जाता है, ताकि लोगों को कोड एक एक छोटे से अधिक समय लग सकता इसे पढ़ने के लिए भी शामिल है कि पढ़ने।

पायथन में एक स्थिर विधि के विकल्प

के फायदों पर चर्चा करने के लिए staticmethod, हमें यह जानना होगा कि विकल्प क्या हैं और वे एक दूसरे से कैसे भिन्न हैं।

  • staticmethodएक वर्ग के अंतर्गत आता है, लेकिन पहुंच सकता है या किसी भी घटना या कक्षा की जानकारी संशोधित नहीं कर सकते।

इसके तीन विकल्प हैं:

  • classmethodफोन करने वाले का वर्ग की पहुंच है।
  • instancemethodफोन करने वाले का उदाहरण और अपने वर्ग की पहुंच है।
  • functionवर्गों के साथ कोई संबंध नहीं है। यह क्षमता के सबसे नजदीक है staticmethod

यहाँ कोड में ऐसा दिखता है:

# function
# has nothing to do with a class
def make_cat_noise(asker_name):
    print('Hi %s, mieets mieets!' % asker_name)

# Yey, we can make cat noises before we've even defined what a cat is!
make_cat_noise('JOey')  # just a function

class Cat:
    number_of_legs = 4

    # special instance method __init__
    def __init__(self, name):
        self.name = name

    # instancemethod
    # the instance (e.g. Cat('Kitty')) is passed as the first method argument
    def tell_me_about_this_animal(self, asker_name):
        print('Hi %s, This cat has %d legs and is called %s'
              % (asker_name, self.number_of_legs, self.name))

    # classmethod
    # the class (e.g. Cat) is passed as the first method argument
    # by convention we call that argument cls
    @classmethod
    def tell_me_about_cats(cls, asker_name):
        print("Hi %s, cats have %d legs."
              % (asker_name, cls.number_of_legs))
        # cls.name  # AttributeError because only the instance has .name
        # self.name  # NameError because self isn't defined in this namespace

    # staticmethod
    # no information about the class or the instance is passed to the method
    @staticmethod
    def make_noise(asker_name):
        print('Hi %s, meooow!' % asker_name)
        # class and instance are not accessible from here

# one more time for fun!
make_cat_noise('JOey')  # just a function

# We just need the class to call a classmethod or staticmethod:
Cat.make_noise('JOey')  # staticmethod
Cat.tell_me_about_cats('JOey')  # classmethod
# Cat.tell_me_about_this_animal('JOey')  # instancemethod -> TypeError

# With an instance we can use instancemethod, classmethod or staticmethod
mycat = Cat('Kitty')  # mycat is an instance of the class Cat
mycat.make_noise('JOey')  # staticmethod
mycat.tell_me_about_cats('JOey')  # classmethod
mycat.tell_me_about_this_animal('JOey')  # instancemethod

1

क्योंकि नामकरण के कार्य अच्छे हैं (जैसा कि पहले बताया गया था):

  1. जब मैं उन तरीकों के बारे में स्पष्ट होना चाहता हूं जो ऑब्जेक्ट की स्थिति को नहीं बदलते हैं, तो मैं स्थैतिक तरीकों का उपयोग करता हूं। यह मेरी टीम के लोगों को उन तरीकों में ऑब्जेक्ट की विशेषताओं को बदलना शुरू करने के लिए हतोत्साहित करता है।

  2. जब मैं वास्तव में सड़े हुए कोड को रिफ्लेक्टर करता हूं, तो मैं यथासंभव अधिक से अधिक विधियां बनाने की कोशिश करता हूं @staticmethod। यह मुझे तब इन विधियों को एक वर्ग में निकालने की अनुमति देता है - हालांकि मैं सहमत हूं, यह शायद ही कभी कुछ है जो मैं उपयोग करता हूं, यह कुछ समय में सहायक हुआ।


1

मेरे अनुमान में, केवल बाहर के फ़ंक्शन को परिभाषित करने और वर्ग से अलग करने की तुलना में s का उपयोग करने का कोई एकल प्रदर्शन लाभ @staticmethodनहीं है अन्यथा यह एक नहीं होगा @staticmethod

केवल एक चीज जो मैं कहूंगा कि उनके अस्तित्व की सुविधा है। अन्य लोकप्रिय प्रोग्रामिंग भाषाओं में स्टैटिक विधियाँ आम हैं, तो अजगर क्यों नहीं? यदि आप व्यवहार के साथ एक फ़ंक्शन बनाना चाहते हैं जो उस वर्ग के साथ बहुत निकटता से जुड़ा हुआ है जिसे आप इसके लिए बना रहे हैं, लेकिन यह वास्तव में कक्षा के एक उदाहरण के आंतरिक डेटा को इस तरह से एक्सेस / संशोधित नहीं करता है जो इसे विशिष्ट के रूप में वैचारिक रूप से सही ठहराता है उस वर्ग की विधि तब @staticmethodइसके ऊपर एक थप्पड़ मारती है और आपके कोड को पढ़ने वाला कोई भी व्यक्ति तुरंत विधि की प्रकृति और कक्षा के संबंध के बारे में बहुत कुछ सीख जाएगा।

एक चीज जो मैं कभी-कभी करना पसंद करता हूं वह है जगह की कार्यक्षमता जो कि मेरी कक्षा निजी तौर पर बहुत अधिक उपयोग करती है @staticmethod। इस तरह मैं अपने मॉड्यूल द्वारा उजागर किए गए एपीआई को उन तरीकों से बंद नहीं करता हूं जो मेरे मॉड्यूल का उपयोग करने वाले किसी व्यक्ति को कभी अकेले उपयोग करने की आवश्यकता नहीं होगी।


0

पायथन में स्थैतिक विधियों का लगभग कोई कारण नहीं है। आप या तो उदाहरण विधियों या वर्ग विधियों का उपयोग करें।

def method(self, args):
    self.member = something

@classmethod
def method(cls, args):
    cls.member = something

@staticmethod
def method(args):
    MyClass.member = something
    # The above isn't really working
    # if you have a subclass

आपने कहा "लगभग"। क्या कोई जगह है जहां वे विकल्पों से बेहतर हो सकते हैं?
जेवियर

@ जेवियर: मैं एक के बारे में नहीं सोच सकता, लेकिन शायद एक है, क्यों उस विधि को पाइथन लाइब्रेरी में शामिल किया जाएगा?
जॉर्ज शॉली

1
@ जेवियर, @ जॉर्ज: आपको बहुत विश्वास है कि पायथन कॉर्पस में क्रॉफ्ट नहीं है।
चार्ल्स मेरियम

-1: यह उत्तर किसी भीstaticmethod या किसी भी उपयोग के मामले को प्रस्तुत नहीं करता है क्या एक की व्याख्या classmethodहै या क्यों और कैसे यह "बेहतर" स्थिर चित्रों की अपेक्षा है।
MestreLion

@CharlesMerriam: निश्चित रूप से स्थिर तरीकों का उपयोग होता है, अन्यथा इसे पायथन 3 में गिरा दिया गया या हटा दिया गया (जहां अधिकांश विरासत क्रॉफ़्ट हटा दिया गया था)। डॉक्स के खिलाफ आपके दावे का समर्थन करने के लिए एक भी शब्द नहीं है staticmethodकि यह cruft है, या जॉर्ज का दावा है कि classmethodइसका उपयोग किया जाना चाहिए)।
MestreLion
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.