我认为 Hugh Bothwell 走在了正确的轨道上,但可以做得更简洁:
class MyClass(object):
_defaults = "attr1", "attr2", "attr3"
_default_value = None
def __init__(self, **kwargs):
self.__dict__.update(dict.fromkeys(self._defaults, self._default_value))
self.__dict__.update(kwargs)
my_object = MyClass(attr3='overridden', attr4='added')
print(vars(my_object))
输出:
{'attr4': 'added', 'attr2': None, 'attr3': 'overridden', 'attr1': None}
我做了_defaults
和_default_value
类属性(可以在运行时更改)。(然而,提供一个可变的默认值可能需要额外的代码来防止它被创建的每个实例共享。)
这将很容易扩展以允许为每个默认属性定义不同的(不可变的)默认值:
class MyClass(object):
_defaults = {
"attr1": None,
"attr2": 0,
"attr3": ""
}
def __init__(self, **kwargs):
self.__dict__.update(self._defaults)
self.__dict__.update(kwargs)
my_object = MyClass(attr3='overridden', attr4='added')
print(vars(my_object))
输出:
{'attr4': 'added', 'attr2': 0, 'attr3': 'overridden', 'attr1': None}