__subclasscheck__ y __subclasshook__ en Python

La clase es una colección de datos (variables y métodos). Agrupa datos y funcionalidad juntos. Proporciona todas las características estándar de la programación orientada a objetos. Básicamente es un modelo para crear objetos. La creación de una nueva clase crea un nuevo tipo de objeto, lo que permite crear nuevas instancias de ese tipo.

Ejemplo:

# class 'A' defined
class A(object):
      
    # Calling Constructor
    def __init__(self, a):
          
        self.a = a
        print("The value of a:", self.a)
  
# Driver's code
c = A(7)

Producción:

The value of a: 7

__subclasscheck__ en Python

__subclasscheck__es uno de los métodos para personalizar el resultado de issubclass()la función integrada. Es un método para verificar si una clase es una subclase o no y devuelve Truesi la clase se considera como una subclase (directa o indirecta) de otra clase, de lo contrario, devuelve False. No se puede definir como un método de clase en la clase actual/real. Se implementa en la metaclase, ya que no es para clases ordinarias. Considere el siguiente ejemplo para una mejor comprensión.

Ejemplo: considere una situación en la que desea verificar si un cierto valor está presente como un atributo dentro de una clase usando el issubclass()método.

# Python program to demonstrate
# subclasscheck
  
  
class A(type):
      
    # __subclasscheck__() defined
    def __subclasscheck__(cls, sub):
          
        # Getting the L attribute of
        # subclass
        attr = getattr(cls, 'L', [])
          
        # Checking if the subclass
        # is present in the L attribute
        # of subclass or not
        if sub in attr:
            return True
          
        return False
  
          
class B(metaclass = A):
      
    # L Attribute
    L = [1, 2, 3, 4, 5]
  
class C(metaclass = A):
      
    # L Attribute
    L = ["Geeks", "For"]
  
  
# Driver's code
print(issubclass(1, B))
print(issubclass("Geeks", B))
print(issubclass("Geeks", C))

Producción:

True
False
True

__subclasshook__ en Python

La clase abstracta puede anular __subclasshook__()el método para personalizar issubclass(). Devuelve Truecuando se encuentra que una clase es una subclase de una clase ABC, devuelve Falsesi no lo es y devuelve NotImplemented si la comprobación de la subclase continúa con el mecanismo habitual. Este método se define en la clase ABC con algunas condiciones. Las clases que siguen esas condiciones se consideran una subclase.

Nota: Debe definirse como un método de clase.

Ejemplo:

# Python program to demonstrate
# subclasshook
  
  
from abc import ABCMeta
  
  
class A(metaclass = ABCMeta):
      
    @classmethod
    def __subclasshook__(cls, C):
        if cls is A:
              
            # condition to check if the 
            # function anyfun() is present 
            # in any sub class or not
            if any("__anyfun__" in Q.__dict__ 
                   for Q in C.__mro__): 
                return True
              
        return False
  
class P(object):
    pass
  
class Q(object):
      
    def __anyfun__(self):
        return 0
  
  
# Driver's code
print(issubclass(Q, A) ) 
print(issubclass(P, A)  )

Producción:

True
False

Publicación traducida automáticamente

Artículo escrito por akritigoswami y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *