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

2024-09-30 22:18:37 发布

您现在位置: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])

我怎样才能建立这样一个父类呢?你知道吗


Tags: 实例方法instancekey属性defspameggs
2条回答

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

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)

一个更完整的答案是可用的here并启发了这个答案。你知道吗

我建议在你希望你的类拥有的属性方面要显式的。否则,您将得到一个具有高度可变性的类,这可能会降低它的有用性。你知道吗

我相信你不用装饰师也能做到:

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.

相关问题 更多 >