首页 > 解决方案 > 如何使用构造函数关键字参数指定 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])

我怎样才能制作这样的父类?


注意: 是的,我知道我正在尝试做的是不好的做法。但有时你只需要按照老板告诉你的去做。

标签: pythonclassdecorator

解决方案


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

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)

此处提供了更完整的回复并启发了此答案。

我建议您明确说明您希望班级拥有的属性。否则,您将得到一个具有高度可变性的类,这可能会降低它的实用性。


推荐阅读