【问题标题】:how to pass argument using metaclass如何使用元类传递参数
【发布时间】:2020-10-24 19:09:34
【问题描述】:

Python 有一个方法 __init__subclass 使用它我可以将参数作为类变量传递

但是当我将__init__subclass 与元类一起使用时,类定义中的参数无法传递给__init__subclass

blew 是我的代码,谁能弄清楚在使用元类时如何将参数传递给__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()

【问题讨论】:

    标签: arguments metaclass


    【解决方案1】:

    您所要做的就是将关键字参数转发到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 用来创建类的“管道”。它 is type.__new__` 负责调用 __init_subclass__ - 如果它没有参数,它就无法做到这一点。 (有人可能会争辩说,这个调用应该在type.__call__ 上完成,当它充当“元元类”并编排对元类的调用__new____init__,但它不是那样构建的)
    猜你喜欢
    • 1970-01-01
    • 2018-10-20
    • 2012-11-25
    • 2015-11-05
    • 2021-04-17
    • 2016-02-11
    • 2013-07-30
    • 1970-01-01
    • 2012-06-17
    相关资源
    最近更新 更多