English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutorial Básico Python

Controle de Fluxo Python

Funções do Python

Tipos de Dados do Python

Operação de Arquivos Python

Objetos e Classes Python

Data e Hora Python

Conhecimento Avançado Python

Manual de Referência Python

Uso e exemplo do classmethod() em Python

Funções integradas do Python

O método classmethod() retorna o método de classe de uma função dada.

A sintaxe do método classmethod() é:

classmethod(function)

O método classmethod() é considerado incorreto em conformidade com a especificação Python, então pode-se usar o decorador @classmethod para definir métodos de classe em versões mais novas do Python.

A sintaxe é:

@classmethod
def func(cls, args...)

Parâmetros do método classmethod()

O método classmethod() aceita um parâmetro:

  • function-Função que precisa ser convertida em método de classe

Retorno do método classmethod()

O método classmethod() retorna o método de classe de uma função dada.

O que é método de classe?

Os métodos de classe estão ligados ao tipo e não ao objeto. Eles não precisam criar um exemplo do tipo, comoclassmethod (método estático)igual.

A diferença entre métodos estáticos e métodos de classe é:

  • Os métodos estáticos não sabem nada sobre o tipo, eles apenas lidam com os parâmetros

  • Os métodos de classe são usados com tipos, porque seus parâmetros sempre são o tipo em si.

Os métodos de classe podem ser chamados por tipos e objetos.

Class.classmethod()
Ou até
Class().classmethod()

Mas de qualquer forma, o método de classe sempre está anexado ao tipo que possui o primeiro parâmetro, porque o tipo em si écls

def classMethod(cls, args...)

Exemplo1Use classmethod() para criar métodos de classe

class Person:
    age = 25
    def printAge(cls):
        print('Idade é:', cls.age)
# criar método de classe printAge
Person.printAge = classmethod(Person.printAge)
Person.printAge()

Quando o programa é executado, a saída é:

Idade é: 25

在这里,我们有一个class Person,其成员变量age被指定为25。

我们还有一个函数printAge,它只接受一个参数cls,而不是我们通常使用的self。

cls接受类Person作为参数,而不是Person的对象/示例。

现在,我们将该方法Person.printAge作为参数传递给该函数classmethod。这会将方法转换为类方法,以便它接受第一个参数作为类(即Person)。

在最后一行中,调用时printAge没有像静态方法那样创建Person对象。这将打印类变量age

什么时候使用类方法?

1.工厂方法

工厂方法是那些针对不同用例返回类对象(如构造函数)的方法。

它类似于C ++中的函数重载。由于Python没有这样的功能,因此使用了类方法和静态方法。

Exemplo2:使用类方法创建工厂方法

from datetime import date
# random Person
class Person:
    def __init__(self, name, idade):
        self.name = name
        self.idade = idade
    @classmethod
    def fromBirthYear(cls, name, anoNascimento):
        return cls(name, date.today().year - anoNascimento)
    def display(self):
        print(self.name + "'s age is: " + str(self.idade))
person = Person('Adam', 19)
person.display()
person1 = Person.fromBirthYear('John',  1985)
person1.display()

Quando o programa é executado, a saída é:

Adam's age is: 19
John's age is: 31

在这里,我们有两个类示例创建者,一个构造函数和一个fromBirthYear方法。

构造函数采用常规参数nameage。而fromBirthYear采用clsnamebirthYear,通过用当前年份减去当前年龄来计算当前年龄,并返回类示例。

fromBirthYear方法将Person类(不是Person对象)作为第一个参数cls,并通过调用返回构造函数cls(name, date.today().year - birthYear),这等效于Person(name, date.today().year - anoNascimento)

在该方法之前,我们看到了@classmethod。这称为装饰器,用于转换fromBirthYear为classmethod()的类方法。

2.在继承中正确创建示例

每当将工厂方法实现为类方法来派生一个类时,它都可以确保正确创建派生类的示例。

您可以为上面的示例创建一个静态方法,但是它创建的对象将始终被硬编码为Base类。

但是,当您使用类方法时,它将创建派生类的正确示例。

Exemplo3:如何通过类方法进行继承?

from datetime import date
# random Person
class Person:
    def __init__(self, name, idade):
        self.name = name
        self.idade = idade
    @staticmethod
    def fromFathersAge(name, idadePai, diferencaIdadePai):
        return Person(name, date.today().year - idadePai + diferencaIdadePai)
    @classmethod
    def fromBirthYear(cls, name, anoNascimento):
        return cls(name, date.today().year - anoNascimento)
    def display(self):
        print(self.name + "'s age is: " + str(self.idade))
class Man(Person):
    sexo = 'Masculino'
man = Man.fromBirthYear('John', 1985)
print(isinstance(man, Man))
man1 = Man.fromFathersAge('John', 1965, 20)
print(isinstance(man1, Man))

Quando o programa é executado, a saída é:

True
False

Aqui, a criação de exemplos de classe usando métodos estáticos requer que codifiquemos o tipo de exemplo durante o processo de criação.

Isso claramente levará a um problema, quando Person herdar de Man.

O método fromFathersAge não retorna um objeto Man, mas um objeto da classe base Person.

Isso viola o paradigma OOP. O uso do método de classe fromBirthYear garante que o código seja orientado a objetos, pois ele usa o primeiro parâmetro como a classe em si e chama seu método factory.

Funções integradas do Python