какая польза и когда использовать @classmethod в python? - PullRequest
0 голосов
/ 19 января 2019

Я никогда не использовал @classmethod, и я не думаю ни о каких примерах, чтобы использовать его, я знаю, как он работает, но я не знаю, когда пришло время использовать его, например

class Example:
    def __init__(self,param1,param2):
        self.param1 = param1
        self.param2 = param2
    @classmethod
    def my_method(cls,param1,param2):
        return cls(param1,param2)

example = Example.my_method(1,2)
print(example)

выход:

<__main__.Example object at 0x02EC57D0>

Но почему бы не сделать это?

class Example:
    def __init__(self,param1,param2):
        self.param1 = param1
        self.param2 = param2

    def my_method(self,param1,param2):
        return Example(param1,param2)

example = Example(1,2)
method = example.my_method(3,4)
print(method)

выход: * +1010 *

<__main__.Example object at 0x02EC57D0>

Это тот же результат, но он не приходит в голову, когда я мог бы использовать classmethod

1 Ответ

0 голосов
/ 19 января 2019

В питоне есть 3 вида методов:

  • Метод экземпляра
  • Метод класса
  • Статический метод
class Person():
    species='homo_sapiens' # This is class variable
    def __init__(self, name, age):
        self.name = name # This is instance variable
        self.age = age

    def show(self):
        print('Name: {}, age: {}.'.format(self.name, date.today().year - self.age))

    @classmethod
    def create_with_birth_year(cls, name, birth_year):
        return cls(name, date.today().year - birth_year)

    @classmethod
    def print_species(cls):
        print('species: {}'.format(cls.species))

    @staticmethod
    def get_birth_year(age):
        return date.today().year - age


class Teacher(Person):
    pass

1) Метод экземпляра ( show ) нуждается в экземпляре и должен использовать self в качестве первого параметра.Он может обращаться к экземпляру через self и влиять на состояние экземпляра.

2) Метод класса ( create_with_birth_year и print_species ) не нуждается виспользуйте экземпляр cls , чтобы получить доступ к классу и повлиять на состояние класса.Мы можем использовать @ classmethod для создания фабрики, например:

navy = Person.create_with_birth_year('Navy Cheng', 1989)
navy.show()

и , эта фабрика может быть унаследована :

zhang = Teacher.create_with_birth_year('zhang', 1980)
print(type(zhang))

и метод класса может использоваться переменная класса доступа:

Person.print_species()

3) Статическому методу ( get_birth_year ) не требуется специальный параметр ( self или cls ) и изменит любое состояние класса или экземпляра.Он может использовать некоторую вспомогательную функцию для класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...