我正在尝试使用attr包来简单地创建一个具有属性和方法的元类,以便在Py 3的进一步的类定义中使用。我想使用attrs包,因为我有很多简单的存储类,只需要一个init的属性很少。一切正常,除了当我尝试将元类添加到主类中时,代码失败,并带有
TypeError: __init__() takes from 1 to 2 positional arguments but 4 were given
简单的MWE为:
from attr import attrs, attrib
from abc import ABCMeta
@attrs
class MetaClass(ABCMeta):
my_attribute = attrib()
def my_method(self):
pass
class MyClass(object, metaclass=MetaClass):
pass
为了实现py2 / 3的兼容性,我通常在其中使用六个包和add_metaclass装饰器,但是如果它可以在Py 2或3中使用,我会很高兴。
attrs
库确实为其要装饰的类生成了一个__init__
方法。但是,元类对__new__
和__init__
方法具有明确定义的签名,每当执行class
语句时(由其主体提供),其参数将由Python运行时本身填充。