Можно ли наследовать метод @static?

Вопрос об этом говорит. У меня есть абстрактный класс, который вызывает staticmethod в вспомогательной функции, и я хочу, чтобы подклассы просто определяли staticmethod и выполняли его.

Может, я мог бы что-то использовать по линии getattr? Должен ли я использовать @classmethod вместо этого?

Ответы

Ответ 1

Что-то вроде этого:

class A(object):
    def func(self):
        self.f()

class B(A):
    @staticmethod
    def f():
        print "I'm B"

Тестирование:

>>> a=x.A()
>>> a.func()
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
  File "x.py", line 3, in func
    self.f()
AttributeError: 'A' object has no attribute 'f'
>>> b=x.B()
>>> b.func()
I'm B

A не работает сам по себе и имеет вспомогательную функцию, вызывающую статический метод. B определяет статический метод. Это работает, если я правильно понимаю, что вы хотите...

Ответ 2

Да, это сработает, если вы используете self для вызова метода или cls в методе class.

Тем не менее, я бы определенно посоветовал вместо этого использовать classmethod. Это позволит имплантировать взгляд на атрибуты класса, и если вы когда-нибудь закончите с несколькими уровнями наследования, это может облегчить работу промежуточных классов, чтобы сделать правильные вещи.

Я понятия не имею, что вы на самом деле делаете в своем методе, поэтому классный метод не купит вам ничего на практике. Это стоит практически ничего не использовать, поэтому вы также можете привыкнуть к этому.