【发布时间】:2020-10-04 03:59:31
【问题描述】:
我对自己构建的课程有疑问。这个类有很多属性,其中一个是字典。我之所以转向拥有字典,是因为我想根据情况在我的类中添加参数,我不知道更好的方法。我知道有可能使用“setattr”动态创建类的新属性,但我读到这不一定是一个好习惯。
class MyClass:
def __init__(self, a, b, params_dict={"p1": 1, "p2":-0.136}):
self.a = a
self.b = b
self.params_dict = params_dict
myobject = MyClass(a=0, b=4, params_dict={"p1": 1, "p2":-0.136, "p3":89})
但现在我被卡住了,因为我想为 params_dict 定义属性。它适用于 getter,但不适用于 setter:
class MyClass:
def __init__(self, a, b, params_dict={"p1": 1, "p2":-0.136}):
self.a = a
self.b = b
self._params_dict = params_dict
def _get_params_dict(self):
return self._params_dict
def _set_params_dict(self, params_dict):
# print("Hello")
params_dict = property(_get_params_dict, _set_params_dict)
myobject = MyClass(a=0, b=4, params_dict={"p1": 1, "p2":-0.136, "p3":89})
print(myobject.params_dict["p1"]) # returns "1", so that is fine
myobject.params_dict["p2"] = 10 # this modifies the dictionary myobject.params_dict but do not print "Hello"
我的理解是没有调用setter,因为我没有更改字典,我只是修改了它的一个键。但是当我只改变它的一个键时如何让它工作呢?
如果您认为还有其他方法可以解决该问题并仍然在那里设置属性,我非常愿意采用更智能的解决方案来即时添加属性。
感谢您的帮助!
编辑:我现在明白,当我执行 myobject.params_dict["p2"] = 10 时,调用的是 getter,而不是 setter,因为它不会将 ["p2"] 识别为 params_dict 的修改。
【问题讨论】:
-
如果你想用
myobject.params_dict["p1"]访问和设置它,你为什么需要这个属性?为什么不直接访问字典?即:self.params_dict = params_dict -
是的,是因为我想在修改字典的时候触发类内部的一个方法,并且禁止在构造对象后添加更多的键。
标签: python class dictionary properties attributes