`স্ট্যাটিকমেডোথ এবং` abc.abstractmethod`: এটি মিশ্রিত হবে?


106

আমার পাইথন অ্যাপে আমি একটি পদ্ধতি তৈরি করতে চাই যা উভয়ই staticmethodএবং একটি 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
সাবক্লাসিংয়ের সাথে সঠিকভাবে কাজ করার জন্য কোডটি আপডেট করেছি। এস্টেস্টেরও __isabstractmethod__বৈশিষ্ট্য থাকা উচিত have
রোশ অক্সিমারন

3
করা উচিত abstractstaticমূল প্রজেক্টের যোগ করা abc.py?
nnyby

3
অ্যাবস্ট্রাক্ট্যাটিকমেডোথ সংস্করণ ৩.৩ থেকে অবহেলিত: এখন এই অলংকরণকারীকে অপ্রয়োজনীয় করে অ্যাবস্ট্রাকটেমোথড () দিয়ে স্ট্যাটিকমেথড ব্যবহার করা সম্ভব। লিঙ্ক
ইরাকলি খিতারিশভিলি

1
@ ইরাকলিখিটারিশ্বিলি তবুও, এটি সাবক্লাসের পদ্ধতিটিকে অচল হতে কার্যকর করে না! আপনাকে স্ট্যাটিকমেডোথ ডেকোরেটারের নকল করতে হবে ... এর কাছাকাছি কোনও উপায় নেই?
12tale- কোহোমোলজি

199

পাইথন ৩.৩ দিয়ে শুরু করে , এটি একত্রিত করা সম্ভব@staticmethod এবং @abstractmethodতাই অন্যান্য পরামর্শগুলির আর কোনওটির প্রয়োজন নেই:

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

32
মনে রাখবেন যে আপনাকে @staticmethodপ্রথম হিসাবে রাখতে হবে, বা আপনি পাবেনAttributeError: attribute '__isabstractmethod__' of 'staticmethod' objects is not writable
মার্কো সুলা

3
জন্য একই@property
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

আপনি যান "এহ? এটি স্রেফ @abstractmethod" এর নামকরণ করেছে, এবং এটি সম্পূর্ণ সঠিক completely কারণ উপরের যে কোনও সাবক্লাসকে যাইহোক @ স্ট্যাটিকমেডোথ ডিকোয়েটার অন্তর্ভুক্ত করতে হবে। কোডটি পড়ার সময় ডকুমেন্টেশন ব্যতীত আপনার এখানে দরকার নেই। একটি সাবক্লাসের মতো দেখতে হবে:

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

এই পদ্ধতিটি একটি স্থিতিশীল পদ্ধতিতে আপনাকে কার্যকর করার জন্য এমন একটি ক্রিয়াকলাপ তৈরি করতে আপনাকে এটি বিসিটি পরীক্ষা করতে এবং এটি প্রয়োগ করার জন্য এবিসিমেটা সাবক্লাস করতে হবে। আসল প্রত্যাবর্তনের জন্য এটি অনেক কাজ। (যদি কেউ @ স্ট্যাটিকমেডোথ ডেকোরিটারকে ভুলে যান তবে তারা যে কোনওভাবেই একটি পরিষ্কার ত্রুটি পাবেন, এটি কেবল স্থির পদ্ধতিগুলির উল্লেখ করবে না।

সুতরাং বাস্তবে এটি ঠিক পাশাপাশি কাজ করে:

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

আপডেট - এটি ব্যাখ্যা করার আরেকটি উপায়:

যে কোনও পদ্ধতি স্থির নিয়ন্ত্রণ এটি কীভাবে বলা হয়। একটি বিমূর্ত পদ্ধতি কখনও বলা হয় না। এবং বিমূর্ত স্থির পদ্ধতি ডকুমেন্টেশনের উদ্দেশ্যে ব্যতীত একটি সুন্দর অর্থহীন ধারণা।


4

পাইথন ২. এক্স-এ এটি বর্তমানে সম্ভব নয়, যা কেবল বিমূর্ত বা স্থিতিশীল হওয়ার পদ্ধতি প্রয়োগ করবে, তবে উভয়ই নয়।

পাইথন ৩.২++ এ নতুন সজ্জকার abc.abstractclassmethodএবংabc.abstractstaticmethod বিমূর্ত এবং স্থির বা বিমূর্ত এবং তাদের পদ্ধতি প্রয়োগের সাথে সংযোজন করা হয়েছিল।

দেখুন পাইথন ইস্যু 5867


11
পাইথন ৩.২-এ নতুন থাকাকালীন abstractclassmethodএবং abstractstaticmethodপাইথন ৩.৩-তে দ্রুত হ্রাস পেয়েছে abstractpropertydocs.python.org/3/library/abc.html
glarrain

4
এফওয়াইআই: bugs.python.org/issue11610 বর্ণনামূলক চিত্রটি বর্ণনা করে এবং এটি করার নতুন উপায় ...
ফ্লিপএমসিএফ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.