【发布时间】:2019-07-03 22:30:03
【问题描述】:
我正在 Python 中创建一个类,但我不确定如何正确设置默认值。我的目标是为所有类实例设置默认值,也可以通过类方法进行修改。但是,我希望在调用方法后恢复初始默认值。
我已经能够使用下面显示的代码使其工作。它不是很“漂亮”,所以我怀疑这是解决这个问题的更好方法。
class plots:
def __init__(self, **kwargs):
self.default_attr = {'a': 1, 'b': 2, 'c': 3}
self.default_attr.update(kwargs)
self.__dict__.update((k, v) for k, v in self.default_attr.items())
def method1(self, **kwargs):
self.__dict__.update((k, v) for k, v in kwargs.items())
#### Code for this method goes here
# Then restore initial default values
self.__dict__.update((k, v) for k, v in self.default_attr.items())
当我使用这个类时,我会执行my_instance = plots() 和my_instance.method1()、my_instance.method1(b = 5) 和my_instance.method1() 之类的操作。第三次调用method1 时,如果我不在方法定义末尾重置默认值,b 将为 5,但我希望它再次为 2。
注意:上面的代码只是一个例子。真正的类有几十个默认值,将它们全部用作输入参数将被视为反模式。
关于如何正确解决此问题的任何建议?
【问题讨论】:
-
def __init__(self, a = 1, b = 2, c = 3, **kwargs):?至于method1,听起来它的kwargs有一个本地范围,那么为什么还要设置全局变量然后在最后重置它们呢?只需将kwargs用作method1中的本地人 -
@Dan 我认为期望是该方法的代码会调用其他方法,他希望他们看到临时修改的属性。
-
mock库提供了patch.dict,您可以将其用作上下文管理器。 -
好吧,如果 混乱 是问题所在,那么
self.__dict__.update((k, v) for k, v in kwargs.items())->self.__dict__.update(kwargs) -
@ReblochonMasque 这是一个棘手的问题。
patch.dict,因为它更新 data 而不是修补名称,所以在mock库中感觉至少有点格格不入。但是在生产代码中使用mock会在我嘴里留下不好的味道,因此是评论而不是答案。