Существует множество способов решения этой проблемы, но если у вас установлен Python 3.7 (или у вас установлен 3.6 и установлен backport ), классы данных могут подойти. для хорошего решения.
Прежде всего, он позволяет вам определять значения по умолчанию в удобочитаемой и компактной форме, а также позволяет выполнять все необходимые операции мутации:
>>> 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)
Вы также можете бесплатно определить фабрики по умолчанию вместо значений по умолчанию с помощью определения поля класса данных . Возможно, это еще не проблема, но он позволяет избежать изменяемого по умолчанию значения gotcha , с которым рано или поздно сталкивается каждый программист на 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()
, изменения не будут сохраняться.