📜  Python中的 __subclasscheck__ 和 __subclasshook__

📅  最后修改于: 2022-05-13 01:55:10.855000             🧑  作者: Mango

Python中的 __subclasscheck__ 和 __subclasshook__

类是数据(变量和方法)的集合。它将数据和功能捆绑在一起。它提供了面向对象编程的所有标准特性。基本上它是创建对象的蓝图。创建一个新类会创建一种新类型的对象,允许创建该类型的新实例。

例子:

# 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)

输出:

The value of a: 7

__subclasscheck__ 在Python中

__subclasscheck__是自定义issubclass()内置函数结果的方法之一。它是一种检查类是否是子类的方法,如果该类被认为是另一个类的子类(直接或间接),则返回True ,否则返回False 。它不能被定义为实际/真实类中的类方法。它在元类中实现,因为它不适用于普通类。请考虑以下示例以更好地理解。

示例:考虑一种情况,您想使用issubclass()方法检查某个值是否作为属性存在于类中。

# 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))

输出:

True
False
True

Python中的 __subclasshook__

抽象类可以重写__subclasshook__()方法来自定义issubclass() 。如果发现一个类是 ABC 类的子类,则返回True ,如果不是,则返回False ,如果继续使用通常的机制检查子类,则返回 NotImplemented。这个方法是在 ABC 类中定义的,有一些条件。符合这些条件的类被视为子类。

注意:它必须定义为类方法。

例子:

# 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)  )

输出:

True
False