python classmethod - Различие между статическим методом и одноклассным методом

python classmethod decorator / python / oop / methods / python-decorators

В чем разница между функцией, украшенной @staticmethod , и функцией, украшенной @classmethod ?

Anand Tripathi



Answer #1

Метод класса: Python, в отличие от Java и C ++, не имеет перегрузки конструктора. И для этого вы можете использовать classmethod . Следующий пример объяснит это

Предположим, у нас есть класс Person , который принимает два аргумента first_name и last_name и создает экземпляр Person .

Предположим, у нас есть класс Person , который принимает два аргумента first_name и last_name и создает экземпляр Person .

class Person(object):

    def __init__(self, first_name, last_name):
        self.first_name = first_name
        self.last_name = last_name

Теперь, если возникает требование, когда вам нужно создать класс, используя только одно имя, только first_name , вы не можете сделать что-то подобное в Python.

Это приведет к ошибке,когда вы попытаетесь создать объект (экземпляр).

class Person(object):

    def __init__(self, first_name, last_name):
        self.first_name = first_name
        self.last_name = last_name

    def __init__(self, first_name):
        self.first_name = first_name

Однако вы можете добиться того же, используя @classmethod , как указано ниже.

Однако вы можете добиться того же, используя @classmethod , как указано ниже.

class Person(object):

    def __init__(self, first_name, last_name):
        self.first_name = first_name
        self.last_name = last_name

    @classmethod
    def get_person(cls, first_name):
        return cls(first_name, "")

Итак, скажем, в приведенном выше примере вам нужна проверка того, что first_name не должно превышать 20 символов, вы можете просто сделать это.

Итак, скажем, в приведенном выше примере вам нужна проверка того, что first_name не должно превышать 20 символов, вы можете просто сделать это.

@staticmethod  
def validate_name(name):
    return len(name) <= 20
Person.validate_name("Gaurang Shah")