我提议对fqxp的答案进行变化,除了允许的属性之外,还可以为属性设置默认值:
class Foo():
def __init__(self, **kwargs):
default_attr = dict(a=0, b=None, c=True)
more_allowed_attr = ['d','e','f']
allowed_attr = list(default_attr.keys()) + more_allowed_attr
default_attr.update(kwargs)
self.__dict__.update((k,v) for k,v in default_attr.items() if k in allowed_attr)
这是 Python 3.x 的代码,如果您使用的是 Python 2.x,则需要至少进行一个调整,items()
需要替换为 iteritems()
。
非常晚的跟进
我最近将上述代码重写为 类装饰器,以将属性的硬编码降至最低。在某种程度上,它类似于 @dataclass
装饰器 的一些特性,您可能希望使用它。
def classattributes(default_attr,more_allowed_attr):
def class_decorator(cls):
def new_init(self,*args,**kwargs):
allowed_attr = list(default_attr.keys()) + more_allowed_attr
default_attr.update(kwargs)
self.__dict__.update((k,v) for k,v in default_attr.items() if k in allowed_attr)
cls.__init__ = new_init
return cls
return class_decorator
@classattributes( dict(a=0, b=None, c=True) , ['d','e','f'] )
class Foo():
pass
@classattributes( dict(g=0, h=None, j=True) , ['k','m','n'] )
class Bar():
pass
obj1 = Foo(d=999,c=False)
obj2 = Bar(h=-999,k="Hello")
obj1.__dict__
obj2.__dict__
pip install attrs
,然后在你的类上加上修饰符@attr.s
,并设置参数如a = attr.ib(); b = attr.ib()
即可。更多信息请阅读此处。 - Adam Barnes