何时需要属性而不是仅仅在Python中公开变量?

时间:2013-05-13 01:45:00

标签: python properties

这是使用Python文档中给出的属性的示例:

Class C(object):
    def __init__(self):
        self._x = None

    def getx(self):
        return self._x
    def setx(self, value):
        self._x = value
    def delx(self):
        del self._x
    x = property(getx, setx, delx, "I'm the 'x' property.")

据我所知,这个行为就像一个普通的无属性实例变量:

Class D(object):
    def __init__(self):
        self.x = None

当然,这不能为getter或setter添加额外的逻辑,但是,由于其他代码与C和D的交互方式没有区别,所以如果需要,可以随后添加属性没有破坏任何其他代码。

我知道如果你使用在类级别声明的可变类型,这会产生问题,即:

class E(object):
    x = [1,2,3]

除了这种情况之外,在需要或者可以接受之前遗弃房产是不好的做法?

谢谢!

2 个答案:

答案 0 :(得分:3)

使用property来评估作为其他属性功能的对象属性的值。考虑以下课程:

class shape:
    def __init__(self,l,w):
        self.length = l
        self.width  = w
    @property
    def area(self):
        return self.length*self.width

如果我们更改长度或宽度的值,当我们要求时,区域的值将立即更新。

[In:]  s = shape(2,3)

[In:]  print s.length, s.width, s.area
[Out:] 2 3 6

[In:]  s.length = 5

[In:]  print s.length, s.width, s.area
[Out:] 5 3 15

为了帮助澄清其工作原理,请考虑以下情况:如果我们尝试在area中定义__init__()

class shape2:
    def __init__(self,l,w):
        self.length = l
        self.width  = w
        self.area = self.length * self.width
只有在实例化类时才会评估

area。更改lengthwidth的值不会修改area的值:

[In:]  s = shape2(2,3)

[In:]  print s.length, s.width, s.area
[Out:] 2 3 6

[In:]  s.length = 5

[In:]  print s.length, s.width, s.area
[Out:] 5 3 6

答案 1 :(得分:1)

我个人认为Python将变量作为其哲学的一部分公开,因此您不需要从所有内容中创建属性。您可以使用属性将逻辑添加到曾经是简单变量的内容,或者为了保持(客户端)代码清洁。

像C in这样的类在教程/文档之外是无用的。

(这是我自己的看法。我不知道什么是“被认为”不好的做法,因为我不是一个经验丰富的开发人员或其他什么)