В моем приложении Python я хочу создать метод, который одновременно является 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__'
python
abstract-class
static-methods
Рам Рахум
источник
источник
Ответы:
источник
import abc
на первое место; а также подкласс, который показывает экземпляр A. (например,class B(A):\n @staticmethod\n def test():\n print 10\n
)__isabstractmethod__
атрибут.abstractstatic
добавить вверх по течению кabc.py
?Начиная с Python 3.3 , можно комбинировать
@staticmethod
и@abstractmethod
, поэтому больше не нужны никакие другие предложения:источник
@staticmethod
первым, иначе вы получитеAttributeError: attribute '__isabstractmethod__' of 'staticmethod' objects is not writable
@property
Это сделает это:
Вы говорите: «А? Он просто переименовывает @abstractmethod», и это совершенно правильно. Потому что любой подкласс из вышеперечисленного в любом случае должен включать декоратор @staticmethod. Здесь он вам не нужен, кроме документации при чтении кода. Подкласс должен выглядеть так:
Чтобы иметь функцию, которая заставит вас сделать этот метод статическим, вам нужно будет создать подкласс ABCmeta, чтобы проверить это и применить его. Это большая работа без реальной отдачи. (Если кто-то забудет декоратор @staticmethod, он все равно получит явную ошибку, просто статические методы не будут упоминаться.
На самом деле это работает точно так же:
Обновление - Другой способ объяснить это:
То, что метод является статическим, определяет, как он вызывается. Абстрактный метод никогда не вызывается. Поэтому абстрактный статический метод - довольно бессмысленное понятие, за исключением целей документации.
источник
В настоящее время это невозможно в Python 2.X, в котором метод будет только абстрактным или статическим, но не обоими сразу.
В Python 3.2+ были добавлены новые декораторы
abc.abstractclassmethod
и,abc.abstractstaticmethod
чтобы объединить их выполнение абстрактных и статических или абстрактных и метода класса.См. Проблему Python 5867
источник
abstractclassmethod
иabstractstaticmethod
быстро устарело в Python 3.3, а такжеabstractproperty
. docs.python.org/3/library/abc.html