#python #oop #static-methods #class-method
#python #ооп #статические методы #класс-метод
Вопрос:
Я понимаю, что статические методы предназначены для выполнения операций, которые не обращаются к методам или атрибутам внутри одного и того же класса. Они просто выполняют определенные операции, для которых не требуется ссылка на класс, например, построение строки с определенным шаблоном. Методы класса, с другой стороны, предназначены для доступа к методам и атрибутам своего собственного класса.
Однако есть ли какая-либо практическая разница между доступом к методам / атрибутам через @staticmethod
или @classmethod
? Смотрите две конструкции ниже.
Получение / настройка через @staticmethod
class Foo:
bar= 1
@staticmethod
def set_bar_static(val):
Foo.bar = val
@staticmethod
def get_bar_static(val):
return Foo.bar
Получение / настройка через @classmethod
class Foo:
bar= 1
@classmethod
def set_bar(cls, val):
cls.bar= val
@classmethod
def get_bar(cls, val):
return cls.bar
Комментарии:
1. Множественное наследование может все испортить.
2. Каким образом? Не могли бы вы подробнее остановиться на этом?
3. Любое наследование может изменить значение. Ваш статический метод статически ссылается на класс
Foo
. Метод классаFoo.set_bar
, вызываемый из подклассаFoo
, устанавливает атрибут для вызывающего класса, а неFoo
.4. Спасибо! Это имеет смысл @chepner! Но если у меня нет никакого наследования, то эти два будут вести себя одинаково, верно?
5. Теперь у вас нет наследования. Представьте, что кто-то другой определил подкласс
Foo
namedBar
. Как вы думаете, они захотятBar.set_bar(3)
установитьFoo.bar
илиBar.bar
?