在我的班级中,我有一个数组作为属性。使用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
因此,如果分配了一个数字,则所有元素都会被更改,如果分配了两个数字,我会更改第一个和最后一个。是这样做的正确方法吗?
答案 0 :(得分: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')
答案 1 :(得分: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]