如何使用元类传递参数

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