В чем разница между stati c и методами класса в Python? - PullRequest
1 голос
/ 01 мая 2020

Я определенно понимаю разницу между методами экземпляра и методами класса / 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 и методами класса?

...