繁体   English   中英

如何跟踪传递给元类的关键字?

[英]How to keep track of keywords passed to metaclass?

我有一个接受关键字参数的元类:

class M(type):
    def __new__(cls, *args, **kwargs):
        print(*kwargs.items())
        super().__new__(cls, *args)

它按预期工作:

class A(metaclass=M, test='X'): pass

产生对象A和打印输出

('test', 'X')

我想提出的一个副本A使用类似这样

def copy_class(cls, name=None):
    if name is None:
        name = cls.__name__
    return type(cls)(name, cls.__bases__, dict(cls.__dict__))

A_copy = copy_class(A, 'A_copy')

但是,关键字不存在。 type(cls) 需要其他参数,或者当它们不在时会产生不同的副作用时,这尤其是个问题。

我知道我可以让M将关键字存储在类对象中的某个位置,但这不是一个很好的解决方案,因为那时我的复制方法非常依赖于类。

是否有内置的方法来检索使用Python创建类的关键字?

Python不会为您保存关键字参数。 这很容易演示:

>>> class DoesntSaveKeywords(type):
...     def __new__(cls, name, bases, dict, **kwargs):
...         return super().__new__(cls, name, bases, dict)
... 
>>> class PrintsOnDel:
...     def __del__(self):
...         print('__del__')
... 
>>> class Foo(metaclass=DoesntSaveKeywords, keyword=PrintsOnDel()):
...     pass
... 
__del__

另外,我认为尝试复制这样的类的基本想法没有道理。 不能保证类的__dict__看起来像最初传递给元类构造函数的东西,也不保证再次调用元类构造函数会做任何合理的事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM