Requisitos previos : clases y objetos de Python , herencia en Python
Independientemente de los lenguajes de programación, la herencia es uno de los temas más importantes en los conceptos de programación orientada a objetos. La herencia es un concepto de definir una clase en términos de otra clase. Según la herencia, sabemos que una referencia de superclase puede contener su referencia de subclase. Todos sabemos que el comportamiento de la superclase puede modificarse según la implementación de su(s) subclase(s).
Pero ahora, podemos alterar el comportamiento de la(s) subclase(s) usando __init_subclass__
__init_subclase__
# defining a SuperClass class SuperClass: # defining __init_subclass__ method def __init_subclass__(cls, **kwargs): cls.default_name ="Inherited Class" # defining a SubClass class SubClass(SuperClass): # an attribute of SubClass default_name ="SubClass" print(default_name) subclass = SubClass() print(subclass.default_name)
Producción :
SubClass Inherited Class
Entendiendo el código
- En el ejemplo anterior, hay 2 clases (es decir, Super Class y SubClass) y SubClass se hereda de SuperClass. default_name es un atributo de SubClass.
- SuperClass modifica el valor del atributo default_name mediante el uso del método __init_subclass__ .
- cls se refiere a las subclases que se heredan. Los argumentos de palabras clave (**kwargs) que se asignan a una nueva clase se pasan a la clase principal __init_subclass__.
- Para la compatibilidad con otras subclases que usan __init_subclass__, uno debe sacar los argumentos de palabras clave necesarios y pasar los demás a la clase base (Super Class).
Esta __init_subclass__
clase de decorador se parece mucho. Pero donde los decoradores de clase solo afectan la clase específica a la que se aplican, __init_subclass__
solo se aplica a las subclases futuras de la clase que define el método. Significa que podemos alterar/definir el comportamiento de cualquier clase nueva que se herede de la superclase.
Ejemplo:
# defining a SuperClass class SuperClass: def __init_subclass__(cls, default_name, **kwargs): cls.default_name = default_name # defining a subclass class SubClass1(SuperClass, default_name ="SubClass1"): pass # defining another subclass class SubClass2(SuperClass, default_name ="SubClass2"): default_name = "InheritedClass" # references for subclasses subClass1 = SubClass1() subClass2 = SubClass2() print(subClass1.default_name) print(subClass2.default_name)
Producción :
SubClass1 SubClass2
Por esto podemos concluir que el método __init_subclass__ se usa para alterar el comportamiento de las subclases que pueden crearse en el futuro.
Publicación traducida automáticamente
Artículo escrito por arwinirahulkumar y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA