0

这是使用 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]

但是,除了这种情况,在需要它们之前忽略这些属性是不好的做法,还是可以接受的?

谢谢!

4

2 回答 2

4

您用于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

为了帮助阐明这是如何工作的,请考虑以下情况:如果我们尝试定义areain __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
于 2013-05-13T01:53:25.797 回答
1

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

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

(这是我自己的观点。我不知道什么是“被认为”的坏习惯,因为我不是经验丰富的开发人员或其他人)

于 2013-05-13T01:56:30.713 回答