我可以向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