Можно ли наследовать метод @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. Это позволит имплантировать взгляд на атрибуты класса, и если вы когда-нибудь закончите с несколькими уровнями наследования, это может облегчить работу промежуточных классов, чтобы сделать правильные вещи.
Я понятия не имею, что вы на самом деле делаете в своем методе, поэтому классный метод не купит вам ничего на практике. Это стоит практически ничего не использовать, поэтому вы также можете привыкнуть к этому.