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