【发布时间】:2020-04-10 09:12:35
【问题描述】:
我正在尝试通过以下实现使用 Python 的 @property 功能:
class DataForm:
def __init__(self):
self._curr_dict = dict()
@property
def curr_dict(self):
return self._curr_dict
@curr_dict.setter
def curr_dict(self, key, val):
if 0 < val < 100:
self._curr_dict[key] = val
else:
raise ValueError("Value is not in range")
getter 工作正常,但是当我尝试为 curr_dict 设置键/值时,它会抛出以下错误:
ob1 = DataForm()
ob1.curr_dict
ob1.curr_dict = ('Jack', 10)
错误:
TypeError Traceback (most recent call last)
<ipython-input-73-cb86bfc26332> in <module>
----> 1 ob1.curr_dict = ('Jack', 10)
TypeError: curr_dict() missing 1 required positional argument: 'val'
我在某处读到 setter 不接受多个参数。那么我该如何实现呢? 或者,这不是解决此问题的更好方法。
我目前的实现如下,它按预期工作:
class DataForm:
def __init__(self):
self.data_dict = dict()
def create_key_value_pair(self, key, value):
self.data_dict[key] = value
def get_dict(self):
return self.data_dict
【问题讨论】:
-
('jack', 10)只是一个元组类型的元素 -
你为什么不尝试实现类似
ob1.curr_dict['Jack'] = 10而不是ob1.curr_dict = ('Jack', 10)的东西? -
@norok2:感谢您的建议。目前,我不确定如何实现这一点。您是否认为我使用 getter/setter 搞砸了一项简单的工作?我在问题中提到的“其他”方法是更好的方法吗?
-
@Sumit 本质上,您需要继承
dict并使curr_dict成为子类 dict 的实例。子类dict应覆盖__setitem__以包含检查。我已经投票决定重新提出这个问题,以便在答案中提供更多关于这个方向的细节。也许您可以相应地编辑您的问题。另见stackoverflow.com/questions/2390827/…
标签: python python-3.x decorator