Еще одно соображение относительно статического метода по сравнению с классическим методом связано с наследованием. Скажем, у вас есть следующий класс:
class Foo(object):
@staticmethod
def bar():
return "In Foo"
И затем вы хотите переопределить bar()
в дочернем классе:
class Foo2(Foo):
@staticmethod
def bar():
return "In Foo2"
Это работает, но обратите внимание, что теперь реализация bar()
в дочернем классе (Foo2
) больше не может использовать в своих интересах что-то определенное для этого класса. Например, скажем, Foo2
имеет метод с именем magic()
, который вы хотите использовать в реализации Foo2
bar()
:
class Foo2(Foo):
@staticmethod
def bar():
return "In Foo2"
@staticmethod
def magic():
return "Something useful you'd like to use in bar, but now can't"
Обходной путь может заключаться в том, чтобы вызвать Foo2.magic()
в bar()
, но затем вы повторяете себя (если имя Foo2
изменится, вам придется помнить об обновлении этого bar()
метода).
Для меня это небольшое нарушение принципа открытия / закрытия , поскольку решение, принятое в Foo
, влияет на вашу способность реорганизовывать общий код в производном классе (т.е. он менее открыт для расширение). Если бы bar()
было classmethod
, мы были бы в порядке:
class Foo(object):
@classmethod
def bar(cls):
return "In Foo"
class Foo2(Foo):
@classmethod
def bar(cls):
return "In Foo2 " + cls.magic()
@classmethod
def magic(cls):
return "MAGIC"
print Foo2().bar()
Дает: In Foo2 MAGIC