【问题标题】:overload setters decorator in pythonpython中的重载设置器装饰器
【发布时间】:2013-06-07 10:46:42
【问题描述】:

在我的班级中,我有一个数组作为属性。使用 setter 装饰器我想以不同的方式为同一个属性分配一个值:

class MyClass:

    def __init__(self):
        self._x=[0,0,0,0]

    @property
    def x(self):
        return self._x

    @x.setter
    def x(self, value):
        self._x = [value,value,value,value]

    @x.setter
    def x(self, value1,value2):
        self._x[0] = value1
        self._x[3] = value2

因此,如果分配了一个数字,则所有元素都将更改,如果分配了两个数字,我将更改第一个和最后一个。这样做是否正确?

【问题讨论】:

  • 您可以使用默认参数值来减少代码。例如,def x(self, value1,value2=None)

标签: python class oop decorator python-decorators


【解决方案1】:

Python 不支持重载,因为它不需要。您通常使用带有默认值的关键字参数:

def x(self, value1, value2=None):
    if value2 is None:
        self._x = [value1] * 4
    else:
        self._x[0] = value1
        self._x[3] = value2

然而,属性上的 setter 只接受 一个 参数,即值;您必须改为检测序列中的传递:

@x.setter
def x(self, value):
    if not isinstance(value, tuple):
        self._x = [value] * 4
    else:
        if len(value) == 2:
            # use indices 0 and 1, rest is discarded?
            self._x[0], self._x[3] = value[0], value[1]
        elif len(value) == 4
            self._x = value
        else:
            raise ValueError('Can only set x to a single value, or a tuple of length 2 or 4')

【讨论】:

  • 你也可以使用Ellipsis作为哨兵。它在标准 Python 中没有用,它是一个独特的单例。
  • @Antimony:当然;但这并没有增加任何东西,文档明智,而且只会让人感到困惑。我宁愿声明一个明确的哨兵。
【解决方案2】:

Python 没有任何基于签名的重载函数的概念。如果你想这样做,你必须在函数内部进行。你可以这样做。

@x.setter
def x(self, value, *args):
    if args:
        self._x[0] = value
        self._x[3] = args[0]
    else:
        self._x = [value,value,value,value]

【讨论】:

  • 我认为这不能作为属性的设置器。您必须查看value 并查看它是否是一个元组并做出相应的反应..
  • @mgilson,啊,我不熟悉属性的工作原理。我刚刚使用了 OP 中的代码示例。
猜你喜欢
  • 2012-01-29
  • 2011-07-17
  • 1970-01-01
  • 2012-02-09
  • 1970-01-01
  • 2013-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多