Método de clase de Python ()

El método classmethod () devuelve un método de clase para la función dada.

La sintaxis del classmethod()método es:

 classmethod (función)

classmethod()se considera no Pythonic, por lo que en las versiones más recientes de Python, puede usar el @classmethoddecorador para la definición del método de clase.

La sintaxis es:

 @classmethod def func (cls, args …)

classmethod () Parámetros

classmethod() El método toma un solo parámetro:

  • función : función que debe convertirse en un método de clase

Valor de retorno de classmethod ()

classmethod() método devuelve un método de clase para la función dada.

¿Qué es un método de clase?

Un método de clase es un método que está vinculado a una clase en lugar de a su objeto. No requiere la creación de una instancia de clase, al igual que staticmethod.

La diferencia entre un método estático y un método de clase es:

  • El método estático no sabe nada sobre la clase y solo se ocupa de los parámetros
  • El método de clase funciona con la clase ya que su parámetro es siempre la clase misma.

El método de clase puede ser llamado tanto por la clase como por su objeto.

 Class.classmethod () O incluso Class (). Classmethod ()

Pero pase lo que pase, el método de clase siempre se adjunta a una clase con el primer argumento como la propia clase cls.

 def classMethod (cls, args …)

Ejemplo 1: crear un método de clase usando classmethod ()

 class Person: age = 25 def printAge(cls): print('The age is:', cls.age) # create printAge class method Person.printAge = classmethod(Person.printAge) Person.printAge()

Salida

 La edad es: 25 

Aquí, tenemos una clase Person, con una edad variable de miembro asignada a 25.

También tenemos una función printAgeque toma un solo parámetro cls y no selfsolemos tomar.

cls acepta la clase Personcomo parámetro en lugar del objeto / instancia de Person.

Ahora, pasamos el método Person.printAgecomo argumento a la función classmethod. Esto convierte el método en un método de clase para que acepte el primer parámetro como una clase (es decir, Persona).

En la línea final, llamamos printAgesin crear un objeto Person como lo hacemos para los métodos estáticos. Esto imprime la edad de la variable de clase.

¿Cuándo usas el método de clase?

1. Métodos de fábrica

Los métodos de fábrica son aquellos métodos que devuelven un objeto de clase (como un constructor) para diferentes casos de uso.

Es similar a la sobrecarga de funciones en C ++. Dado que Python no tiene nada como tal, se utilizan métodos de clase y métodos estáticos.

Ejemplo 2: crear un método de fábrica utilizando el método de clase

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

Salida

 La edad de Adán es: 19 La edad de Juan es: 31 

Aquí, tenemos dos creadores de instancias de clases, un constructor y un fromBirthYearmétodo.

El constructor toma el nombre y la edad de los parámetros normales. Mientras, fromBirthYeartoma clase, nombre y año de nacimiento, calcula la edad actual restándola del año actual y devuelve la instancia de la clase.

El método fromBirthYear toma la clase Person (no el objeto Person) como el primer parámetro cls y devuelve el constructor llamando cls(name, date.today().year - birthYear), que es equivalente aPerson(name, date.today().year - birthYear)

Antes del método, vemos @classmethod. Esto se llama decorador para convertir fromBirthYeara un método de clase como classmethod().

2. Creación correcta de instancias en herencia

Siempre que deriva una clase de la implementación de un método de fábrica como método de clase, asegura la creación correcta de la instancia de la clase derivada.

Puede crear un método estático para el ejemplo anterior, pero el objeto que crea siempre estará codificado como clase Base.

Pero, cuando usa un método de clase, crea la instancia correcta de la clase derivada.

Ejemplo 3: ¿Cómo funciona el método de clase para la herencia?

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

Salida

 Verdadero Falso 

Aquí, el uso de un método estático para crear una instancia de clase quiere que codifiquemos el tipo de instancia durante la creación.

Esto causa un problema con claridad al heredar Persona Man.

fromFathersAgeEl método no devuelve un Manobjeto, sino el objeto de su clase base Person.

Esto viola el paradigma OOP. El uso de un método de clase como fromBirthYearpuede garantizar la OOP-ness del código, ya que toma el primer parámetro como la clase en sí y llama a su método de fábrica.

Articulos interesantes...