Я определенно понимаю разницу между методами экземпляра и методами класса / stati c в Python. Иногда вы не хотите, чтобы фактический экземпляр объекта выполнял некоторые операции. Может быть, он получает определенную информацию, которая хранится во всех случаях. Тем не менее, я не могу на всю жизнь понять разницу между методами класса и stati c.
Я понимаю, что методы класса принимают аргумент класса (обычно cls
), и это относится к текущему классу. , Тогда stati c методы не должны принимать никаких аргументов. Тем не менее, единственное основное отличие, которое я видел в Интернете, заключается в том, что методы класса имеют доступ для чтения / изменения «состояний класса». Я не могу найти хорошее объяснение того, что такое «состояние класса».
Вот код, который я запустил с выводом ниже.
class Person:
SPECIES = "homo sapien"
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f"{self.name} is {self.age} years old"
def get_species(self):
print(f"species: {Person.SPECIES}")
def change_species_instance_method(self):
Person.SPECIES="homo sapien (instance)"
@classmethod
def change_species_class_method(cls):
cls.SPECIES="homo sapien (class)"
@staticmethod
def change_species_static_method():
Person.SPECIES="homo sapien (static)"
me = Person("Kevin", 20)
sam = Person("Sam", 20)
me.get_species()
sam.get_species()
me.change_species_instance_method()
print()
me.get_species()
sam.get_species()
me.change_species_class_method()
print()
me.get_species()
sam.get_species()
me.change_species_static_method()
print()
me.get_species()
sam.get_species()
OUTPUT
species: homo sapien
species: homo sapien
species: homo sapien (instance)
species: homo sapien (instance)
species: homo sapien (class)
species: homo sapien (class)
species: homo sapien (static)
species: homo sapien (static)
Итак, если методы класса и stati c могут изменять переменные класса (в данном случае SPECIES), то в чем разница между ними, кроме определения методов класса, требующих cls
? Спасибо!
Еще одно различие, которое люди сказали, заключается в том, что методы класса используются для создания новых экземпляров класса, но я смог сделать это и со stati c. Итак, что-то в относительной сложности кода, который я пишу (то есть без наследования классов), есть ли функциональная разница между stati c и методами класса?