如何使用元类传递参数
how to pass argument using metaclass
Python 有一个方法 __init__subclass
使用它我可以将参数作为 class 变量传递
但是当我将 __init__subclass
与 metaclass 一起使用时,class 定义中的参数无法传递给 __init__subclass
。
blew 是我的代码,谁能知道在使用 metaclass 时如何将参数传递给 __init__subclass
?
class person(type):
def __new__(cls, name, base, namespace, *args, **kwargs):
return type.__new__(cls, name, base, namespace)
@classmethod
def __prepare__(name, bases, *args, **kwargs):
dict1 = {}
dict1['a'] = 1
return dict1
class teacher(metaclass=person):
def __init_subclass__(cls, default_name, **kwargs):
super().__init_subclass__(**kwargs)
print('begin initilize subclass')
print(kwargs)
cls.default_name = default_name
class teacherwdname(teacher, default_name='kevin'):
teach = 'physics'
c = teacherwdname()
您所要做的就是将关键字参数转发给 type.__new__
- 在您的实现中,您正在 type.__new__(cls, name, base, namespace)
中吞下它们
当你转发它们时看看它的工作情况:
In [1]: class Meta(type):
...: def __new__(mcls, names, bases, namespace, **kw):
...: return super().__new__(mcls, names, bases, namespace, **kw)
...:
In [2]: class Base(metaclass=Meta):
...: def __init_subclass__(cls, test_param, **kw):
...: print(f"Initializing with {test_param}")
...:
...:
...:
In [3]: class A(Base, test_param="testing"): pass
Initializing with testing
Python 有一个方法 __init__subclass
使用它我可以将参数作为 class 变量传递
但是当我将 __init__subclass
与 metaclass 一起使用时,class 定义中的参数无法传递给 __init__subclass
。
blew 是我的代码,谁能知道在使用 metaclass 时如何将参数传递给 __init__subclass
?
class person(type):
def __new__(cls, name, base, namespace, *args, **kwargs):
return type.__new__(cls, name, base, namespace)
@classmethod
def __prepare__(name, bases, *args, **kwargs):
dict1 = {}
dict1['a'] = 1
return dict1
class teacher(metaclass=person):
def __init_subclass__(cls, default_name, **kwargs):
super().__init_subclass__(**kwargs)
print('begin initilize subclass')
print(kwargs)
cls.default_name = default_name
class teacherwdname(teacher, default_name='kevin'):
teach = 'physics'
c = teacherwdname()
您所要做的就是将关键字参数转发给 type.__new__
- 在您的实现中,您正在 type.__new__(cls, name, base, namespace)
当你转发它们时看看它的工作情况:
In [1]: class Meta(type):
...: def __new__(mcls, names, bases, namespace, **kw):
...: return super().__new__(mcls, names, bases, namespace, **kw)
...:
In [2]: class Base(metaclass=Meta):
...: def __init_subclass__(cls, test_param, **kw):
...: print(f"Initializing with {test_param}")
...:
...:
...:
In [3]: class A(Base, test_param="testing"): pass
Initializing with testing