python中的重载setters修饰符

python中的重载setters修饰符,python,class,oop,decorator,python-decorators,Python,Class,Oop,Decorator,Python Decorators,在我的类中,我有一个数组作为属性。使用setter decorator,我希望以不同的方式将值分配给同一属性: 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,val

在我的类中,我有一个数组作为属性。使用setter decorator,我希望以不同的方式将值分配给同一属性:

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

所以,如果分配了一个数字,所有元素都会改变,如果分配了两个数字,我会改变第一个和最后一个。这是正确的方法吗?

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]

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]

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')

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')

您可以使用默认参数值来减少代码。例如,
def x(self,value1,value2=None)
您可以使用默认参数值来减少代码。例如,
defx(self,value1,value2=None)
。您必须查看
value
并查看它是否是一个元组,然后做出相应的反应。@mgilson,啊,我不熟悉属性如何工作。我只是在OP中使用了代码示例。我认为这不能作为属性的setter。您必须查看
value
并查看它是否是一个元组,然后做出相应的反应。@mgilson,啊,我不熟悉属性如何工作。我刚刚在OP中使用了代码示例。您还可以使用
省略号作为哨兵。它在标准Python中没有用处,而且是一个独特的单例。@sbumb:当然;但这并没有增加任何东西,从文档角度看,这只会让人感到困惑。我宁愿声明一个显式的哨兵。你也可以使用
省略号
作为哨兵。它在标准Python中没有用处,而且是一个独特的单例。@sbumb:当然;但这并没有增加任何东西,从文档角度看,这只会让人感到困惑。我宁愿宣布一个明确的哨兵。