有很多方法可以解决这个问题,但是如果你安装了 python 3.7(或者安装了 3.6)向后移植 https://pypi.org/project/dataclasses/), 数据类 https://docs.python.org/3/library/dataclasses.html可能是一个很好的解决方案。
首先,它允许您以可读且紧凑的方式定义默认值,并且还允许您需要的所有突变操作:
>>> from dataclasses import dataclass
>>> @dataclass
... class Plots:
... a: int = 1
... b: int = 2
... c: int = 3
...
>>> p = Plots() # create a Plot with only default values
>>> p
Plots(a=1, b=2, c=3)
>>> p.a = -1 # update something in this Plot instance
>>> p
Plots(a=-1, b=2, c=3)
您还可以选择免费定义默认工厂而不是默认值数据类字段定义 https://docs.python.org/3/library/dataclasses.html#dataclasses.field。这可能还不是问题,但它避免了可变默认值陷阱 https://docs.python-guide.org/writing/gotchas/#mutable-default-arguments每个 python 程序员迟早都会遇到这种情况。
最后但并非最不重要的一点是,写一个reset
给定现有数据类,函数非常容易,因为它跟踪其中已有的所有默认值__dataclass_fields__
属性:
>>> from dataclasses import dataclass, MISSING
>>> @dataclass
... class Plots:
... a: int = 1
... b: int = 2
... c: int = 3
...
... def reset(self):
... for name, field in self.__dataclass_fields__.items():
... if field.default != MISSING:
... setattr(self, name, field.default)
... else:
... setattr(self, name, field.default_factory())
...
>>> p = Plots(a=-1) # create a Plot with some non-default values
>>> p
Plots(a=-1, b=2, c=3)
>>> p.reset() # calling reset on it restores the pre-defined defaults
>>> p
Plots(a=1, b=2, c=3)
现在你可以编写一些函数do_stuff(...)
更新 Plot 实例中的字段,只要执行reset()
更改不会持续存在。