如何使用构造函数关键字参数指定Python类属性



我正试图想出一种方法,允许在实例化时指定任意数量的类属性,非常类似于字典。理想用例:

>>> instance = BlankStruct(spam=0, eggs=1)
>>> instance.spam
0
>>> instance.eggs
1

其中BlankStruct定义为:

class BlankStruct(Specifiable):
@Specifiable.specifiable
def __init__(self, **kwargs):
pass

我曾想过使用父类装饰器,但在考虑是使用实例方法、类方法还是静态方法(或者可能不使用以上任何方法!(时,我陷入了一场头脑风暴。这是迄今为止我提出的最好的方法,但问题是属性被应用于类而不是实例:

class Specifiable:
@classmethod
def specifiable(cls, constructor):
def constructor_wrapper(*args, **kwargs):
constructor(*args, **kwargs)
cls.set_attrs(**kwargs)
return constructor_wrapper
@classmethod
def set_attrs(cls, **kwargs):
for key in kwargs:
setattr(cls, key, kwargs[key])

我怎么能上这样的家长课?


注意:是的,我知道我想做的是糟糕的练习。但有时候你只需要按照老板告诉你的去做。

是的,您可以执行以下操作,但我不建议这样做,因为这显然违背了显式优于隐式原则:

class BlankStruct:
def __init__(self, **attrs):
self.__dict__.update(**attrs)
def __getattr__(self, attr):
return self.__dict__.get(attr, None)
f = BlankStruct(spam=0, eggs=1)

这里有一个更完整的回应,并启发了这个答案。

根据您希望类具有的属性,我建议使用显式。否则,您将得到一个具有高度可变性的类,这可能会降低它的有用性。

我相信你可以在没有装饰器的情况下做到这一点:

class Specifiable:
def __init__(self, **kwargs):
for key, value in kwargs.items():
setattr(self, key, value)

class BlankStruct(Specifiable):
def __init__(self, **kwargs):
super().__init__(**kwargs)
# Do other stuff.

最新更新