__subclasscheck__ and __subclasshook__ in Python
Last Updated :
30 Jan, 2020
Class is a collection of data (variables and methods). It bundles data and functionality together. It provides all standard features of object-oriented programming. Basically it is a blueprint for creating objects. Creating a new class creates a new type of object, allowing new instances of that type to be made.
Example:
class A( object ):
def __init__( self , a):
self .a = a
print ( "The value of a:" , self .a)
c = A( 7 )
|
Output:
The value of a: 7
__subclasscheck__ in Python
__subclasscheck__
is one of the methods to customize the result of issubclass()
built-in function. It is a method to check whether a class is a subclass or not and returns True
if the class is considered as a subclass(direct or indirect) of another class, otherwise, returns False
. It cannot be defined as a class method in the actual/real class. It is implemented in the metaclass, as it is not for ordinary classes. Consider the below example for better understanding.
Example: Consider a situation where you want to check if a certain value is present as an attribute inside a class using the issubclass()
method.
class A( type ):
def __subclasscheck__( cls , sub):
attr = getattr ( cls , 'L' , [])
if sub in attr:
return True
return False
class B(metaclass = A):
L = [ 1 , 2 , 3 , 4 , 5 ]
class C(metaclass = A):
L = [ "Geeks" , "For" ]
print ( issubclass ( 1 , B))
print ( issubclass ( "Geeks" , B))
print ( issubclass ( "Geeks" , C))
|
Output:
True
False
True
__subclasshook__ in Python
Abstract class can override __subclasshook__()
method to customize issubclass()
. It returns True
when a class is found to be subclass of a ABC class, it returns False
if it is not and returns NotImplemented if the subclass check is continued with the usual mechanism. This method is defined in the ABC class with some conditions. Classes that follow those conditions are considered to be a subclass.
Note: It must be defined as a class method.
Example:
from abc import ABCMeta
class A(metaclass = ABCMeta):
@classmethod
def __subclasshook__( cls , C):
if cls is A:
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
print ( issubclass (Q, A) )
print ( issubclass (P, A) )
|
Output:
True
False
Share your thoughts in the comments
Please Login to comment...