【问题标题】:How to pass more than one argument in Python Setter method [duplicate]如何在 Python Setter 方法中传递多个参数 [重复]
【发布时间】: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


【解决方案1】:

Setter 并不是这样工作的,它们的目的是处理对您的属性的赋值语句,因此它们只会接受一个参数,即= 运算符右侧的任何参数。如果你想对参数做进一步的处理,你需要在setter body中做:

@curr_dict.setter
def curr_dict(self, arg):
    key, val = arg # <<<<<<<<<<<<<<

    if 0 < val < 100:
        self._curr_dict[key] = val

    else:
        raise ValueError("Value is not in range")

注意:定义一个设置器以这种方式(在这种特定情况下)行为是否是一个好主意是值得怀疑的。就个人而言,我认为这是一个坏主意,因为您正在将 dict 分配转换为“something = (key, value)”,这可能会引发错误(并且对于最终用户来说可能看起来不像键值分配)。

【讨论】:

  • 很好的答案,但我不相信这是有问题的。或者也许我只是在质疑它:-) 我认为传入可以成为正确值的 any 类型没有问题。例如,一个复变量可能会得到一个包含实部和虚部的元组,一个有理数可能会得到一个包含分子和分母的元组,一个地址可能会得到一个地址行列表,您只需在上面执行addr = "\n".join(addList) + "\n"。有了 RTTI,无限的可能性比比皆是。说它会引发错误与说 unsigned int 字段在尝试将其设置为 -1 时会引发错误没有什么不同。
  • GPhilo,键/值分配,是的,我同意,这就是你得到我投票的原因。我只是不确定我是否同意一般案例。
  • @GPhilo 我的意思是:“注意:定义一个设置器以这种方式运行是否是一个好主意是值得怀疑的。”
  • @norok2 哦!是啊,你说得对。补充说 ;)
  • @Sumit 我也不熟悉设计属性,所以我认为我不是这里最好的帮助来源。您可能想在 CodeReview 或 SoftwareEngineering 上发布问题(两者都是其他 Stackexchange 网站,更多关于替代设计建议的主题)
猜你喜欢
  • 2015-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-18
  • 2014-10-22
  • 2014-01-27
相关资源
最近更新 更多