我可以向python属性添加参数以减少代码重复吗?
我在以下课程中有一门课:我可以向python属性添加参数以减少代码重复吗?,python,Python,我在以下课程中有一门课: class Vector(object): def __init__(self, x=0, y=0, z=0): self.x = x self.y = y self.z = z def _getx(self): return self._x def _setx(self, value): self._x = float(value) x = proper
class Vector(object):
def __init__(self, x=0, y=0, z=0):
self.x = x
self.y = y
self.z = z
def _getx(self):
return self._x
def _setx(self, value):
self._x = float(value)
x = property(_getx, _setx)
def _gety(self):
return self._y
def _sety(self, value):
self._y = float(value)
y = property(_gety, _sety)
def _getz(self):
return self._z
def _setz(self, value):
self._z = float(value)
z = property(_getz, _setz)
三个getter和setter都是相同的,除了它们正在修改的对象属性(x,y,z)。是否有一种方法可以编写一个get和一个set,然后传递要修改的变量,这样我就不会重复自己的操作?未测试,但这应该可以:
def force_float(name):
def get(self):
return getattr(self, name)
def set(self, x):
setattr(self, name, float(x))
return property(get, set)
class Vector(object):
x = force_float("_x")
y = force_float("_y")
# etc
当然,请按照以下章节中明确解释的概念制作自定义描述符: 然后使用它:
class Vector(object):
def __init__(self, x=0, y=0, z=0):
self.x = x
self.y = y
self.z = z
x = JonProperty('_x')
y = JonProperty('_y')
z = JonProperty('_z')
为什么不写这个呢
class Vector(object):
def __init__(self, x=0, y=0, z=0):
self.x = x
self.y = y
self.z = z
如果您的getter和setter实际上是Java之类的东西的遗留物,那么不要编写它们。只需公开属性x、y和z。如果有必要,您可以稍后将它们更改为属性,并且,与Java(需要某种重新编译)不同,所有客户机代码仍然可以正常工作
关于Python中的getter和setter主题,据我所知,普遍的共识是“在需要之前不要编写它们”。只有在setter和getter确实为程序增加了价值(比如保护内部数据结构)时才编写它们。否则,就不要使用它们,而是花时间进行实际的生产性编码。最初我想要一种机制,以确保x、y和z始终是一个浮点数,以防用户输入int或string。然而,我开始更多地思考这个问题,并同意你的看法。我将继续使用“我们都是成年人”的python态度,并将其留给类用户来确保存储浮点。不过,我学到的关于定义装饰器的知识是值得的。是的,它是有效的,除了应该初始化x和y之外。
class Vector(object):
def __init__(self, x=0, y=0, z=0):
self.x = x
self.y = y
self.z = z