【发布时间】:2018-06-12 15:50:03
【问题描述】:
给定一个允许 3 种可能输入的类定义:
class FooBar(object):
def __init__(self, x=None, y=None, z=None):
if x is not None:
self.x = x
elif if y is not None:
self.y = y
elif if z is not None:
self.z = z
else:
raise ValueError('Please supply either x,y or z')
这 3 个输入是相互关联的,比如说:
x = .5*y = .25*z
这也意味着:
y = .5*z = 2*x
和
z = 2*y = 4*x
当创建FooBar() 的实例时,用户需要提供其中之一,__init__ 会处理它。
现在我想做以下事情
- 如果 3 个变量中的任何一个发生变化,其他变量也会按照关系发生变化。
为了实现我所做的:
@property
def x(self):
return self._x
@x.setter
def x(self, value):
self._x = value
self._y = 2*self._x
self._z = 4*self._x
还有其他人:
@property
def y(self):
return self._y
@y.setter
def y(self, value):
self._y = value
self._x = .5*self._y
self._z = 2*self._y
@property
def z(self):
return self._z
@z.setter
def z(self, value):
self._z = value
self._x = .25*self._z
self._y = .5*self._z
这是正确的方法吗?
【问题讨论】:
-
如果我提供
FooBar(x=1, y=1425)怎么办? -
如果
x = 2*y,则self._y = value/2为x的设置器。不是value * 2。 -
基于我的
__init__,x优先,这就是和if elif...的原因。 -
好的。我做了相反的事情,你是对的。但我更担心的是实例变量设置。
标签: python class properties getter-setter