这是使用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]
除了这种情况之外,在需要或者可以接受之前遗弃房产是不好的做法?
谢谢!
答案 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
。更改length
或width
的值不会修改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这样的类在教程/文档之外是无用的。
(这是我自己的看法。我不知道什么是“被认为”不好的做法,因为我不是一个经验丰富的开发人员或其他什么)