`staticmethod` और` abc.abbridmethod`: क्या यह मिश्रण होगा?


106

अपने पायथन ऐप में मैं एक ऐसा तरीका बनाना चाहता हूँ जो a staticmethodऔर a दोनों हो abc.abstractmethod। मैं यह कैसे करु?

मैंने दोनों सज्जाकारों को लागू करने की कोशिश की, लेकिन यह काम नहीं करता है। अगर मैं ऐसा करता हूं:

import abc

class C(object):
    __metaclass__ = abc.ABCMeta

    @abc.abstractmethod
    @staticmethod    
    def my_function(): pass

मुझे एक अपवाद * मिलता है, और अगर मैं ऐसा करता हूं:

class C(object):
    __metaclass__ = abc.ABCMeta

    @staticmethod    
    @abc.abstractmethod
    def my_function(): pass

अमूर्त विधि लागू नहीं है।

मैं एक सार स्थिर विधि कैसे बना सकता हूं?

*अपवाद:

File "c:\Python26\Lib\abc.py", line 29, in abstractmethod
 funcobj.__isabstractmethod__ = True
AttributeError: 'staticmethod' object has no attribute '__isabstractmethod__'

5
कृपया अपना स्वीकृत उत्तर अपडेट करें।
नील जी

जवाबों:


34
class abstractstatic(staticmethod):
    __slots__ = ()
    def __init__(self, function):
        super(abstractstatic, self).__init__(function)
        function.__isabstractmethod__ = True
    __isabstractmethod__ = True

class A(object):
    __metaclass__ = abc.ABCMeta
    @abstractstatic
    def test():
        print 5

7
अच्छा खेला, सर या मैडम :-) आपने import abcसबसे ऊपर छोड़ दिया ; साथ ही एक उपवर्ग जो ए। (जैसे, class B(A):\n @staticmethod\n def test():\n print 10\n) की तात्कालिकता को दर्शाता है
दान ब्रेस्लाउ

1
मैंने उपवर्ग के साथ ठीक से काम करने के लिए कोड को अपडेट किया। A .est में भी __isabstractmethod__विशेषता होनी चाहिए ।
रोश ऑक्सीमोरोन

3
abstractstaticऊपर की तरफ जोड़ा जाना चाहिए abc.py?
nnyby

3
संस्करण 3.3 के बाद से एब्सट्रस्टेटिकमेथोड का पदावनत किया गया: अब एब्सट्रैमेथोड () के साथ स्टैटिकमेथोड का उपयोग करना संभव है, जिससे यह डेकोरेटर बेमानी हो जाता है। लिंक
irakli khitarishvili

1
@iraklikhitarishvili स्टिल होने के लिए उपवर्ग की विधि को लागू नहीं करता है! आपको स्थैतिक डेकोरेटर को डुप्लिकेट करना होगा ... क्या इसके आसपास कोई रास्ता नहीं है?
étale-cohomology

199

पायथन 3.3 के साथ शुरू करना , संयोजन करना संभव है @staticmethod और @abstractmethod, इसलिए अन्य सुझावों में से कोई भी आवश्यक नहीं है:

@staticmethod
@abstractmethod
def my_abstract_staticmethod(...):

32
ध्यान दें कि आपको @staticmethodपहले के रूप में रखना होगा, या आप प्राप्त करेंगेAttributeError: attribute '__isabstractmethod__' of 'staticmethod' objects is not writable
मार्को सुल

3
उसी के लिए@property
9:00 पर zezollo

11
यदि यह स्वीकृत उत्तर होता तो यह वास्तव में मददगार होता!
कीर्तन प्रभाकरन

ठीक वही जो मेरे द्वारा खोजा जा रहा था। धन्यवाद!
शानू खीरा

13

यह यह करेगा:

  >>> import abc
  >>> abstractstaticmethod = abc.abstractmethod
  >>>
  >>> class A(object):
  ...     __metaclass__ = abc.ABCMeta
  ...     @abstractstaticmethod
  ...     def themethod():
  ...          pass
  ... 
  >>> a = A()
  >>> Traceback (most recent call last):
  File "asm.py", line 16, in <module>
    a = A()
  TypeError: Can't instantiate abstract class A with abstract methods test

आप "एह! यह सिर्फ @abbridmethod का नाम बदल देते हैं", और यह पूरी तरह से सही है। क्योंकि ऊपर के किसी भी उपवर्ग को वैसे भी @staticmethod डेकोरेटर को शामिल करना होगा। कोड पढ़ते समय प्रलेखन के अलावा आपको इसकी कोई आवश्यकता नहीं है। एक उपवर्ग को इस तरह देखना होगा:

  >>> class B(A):
  ...     @staticmethod
  ...     def themethod():
  ...         print "Do whatevs"

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

तो वास्तव में यह काम करता है:

  >>> import abc
  >>>
  >>> class A(object):
  ...     __metaclass__ = abc.ABCMeta
  ...     @abc.abstractmethod
  ...     def themethod():
  ...         """Subclasses must implement this as a @staticmethod"""
  ...          pass

अपडेट - इसे समझाने का दूसरा तरीका:

यह विधि स्थैतिक नियंत्रण है कि इसे कैसे कहा जाता है। एक अमूर्त विधि कभी नहीं कहा जाता है। और सार स्थिर विधि इसलिए प्रलेखन उद्देश्यों को छोड़कर एक बहुत ही बेकार अवधारणा है।


4

यह वर्तमान में पायथन 2.X में संभव नहीं है, जो केवल अमूर्त या स्थिर होने की विधि को लागू करेगा, लेकिन दोनों नहीं।

पायथन 3.2+ में, नए सज्जाकार abc.abstractclassmethodऔर abc.abstractstaticmethodअमूर्त और स्थिर या अमूर्त और एक वर्ग विधि होने के अपने प्रवर्तन को संयोजित करने के लिए जोड़े गए थे।

पायथन अंक 5867 देखें


11
जबकि पायथन 3.2 में नया, abstractclassmethodऔर abstractstaticmethodपायथन 3.3 में तेजी से वंचित किया गया था, साथ ही साथ abstractpropertydocs.python.org/3/library/abc.html
glarrain

4
FYI करें: bugs.python.org/issue11610 डिप्रैशन का वर्णन करता है, और इसे करने का नया तरीका ...
FlipMcF
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.