问题来源:为什么定义元类和自定义元类时,在调用父类的__new__方法时都是需要显式传递cls的,而__init__在调用父类__init__方法时就是隐式的。
# 自定义元类
class MyMeta(type):
def __new__(cls, name, bases, dct):
print(f"Creating class {name} using MyMeta")
return super().__new__(cls, name, bases, dct)
def __init__(cls, name, bases, dct):
print(f"Initializing class {name} using MyMeta")
super().__init__(name, bases, dct)
# 使用自定义元类创建类
class MyClass(metaclass=MyMeta):
def __new__(cls, *args, **kwargs):
print(f"Creating an instance of {cls.__name__}")
instance = super().__new__(cls,*args, **kwargs) # 调用父类的 __new__ 方法
return instance
def __init__(self, name):
print(f"Initializing an instance of {self.__class__.__name__}")
self.name = name
def __call__(self):
print(f"Instance of {self.__class__.__name__} is being called!")
# 实例化 MyClass
print("\n-- Step 1: Create an instance --")
obj = MyClass("Alice")
# 调用实例
print("\n-- Step 2: Call the instance --")
obj()
原因:这是因为__new__是静态方法,不依赖于实例调用,而依赖于类本身。 因此,Python 要显式地将 cls 传递给__new__方法。
那么为什么 cls 需要显式传递?
在元类中,cls 是动态决定的
在元类的 __new__ 方法中,cls 代表将要创建的类。
• 调用 super().__new__(cls, name, bases, dct) 时:
• super() 调用的是父类(通常是 type)的 __new__ 方法。
• cls 需要明确告诉 type.__new__ 它要创建哪个类。
• type.__new__ 会根据 cls 创建一个类。
具体调用流程:
• Python 调用元类的 __new__ 时,会显式传递 cls。
• 元类的 __new__ 需要将 cls 传递给 type.__new__,否则父类不知道该创建哪个类。
标签:__,元类,.__,name,传递,new,cls
From: https://www.cnblogs.com/hayaso/p/18595710