python属性(property)的理解

2016-10-26 18:18:06

概念

property([fget[, fset[, fdel[, doc]]]])
property()函数前面三个参数分别对应于数据描述符的中的__get__,__set__,__del__方法,所以它们之间会有一个内部的与数据描述符的映射。

1
2
3
4
5
6
7
8
9
10
11
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.")

练习

通常可以用__getattr__(self, name)来查询即时生成的属性。当我们查询一个属性时,如果无法通过__dict__找到该属性,那么Python会调用对象的__getattr__方法,来即时生成。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Rectangle(object):
def __init__(self, width=0, height=0):
self.width = width
self.height = height

def __setattr__(self, name, value):
if name == 'area':
raise Exception('area can not be set. Please set the area by set width and height.')
else:
self.__dict__[name] = value

def __getattr__(self, name):
if name == 'area':
return self.width*self.height
else:
raise AttributeError

if __name__ == '__main__':
rt = Rectangle(5, 6)
print rt.area
rt.width, rt.height = 3, 4
print rt.area
rt.area = 100

__getattr__可以将所有的即时生成属性放在同一个函数中处理。__getattr__可以根据函数名区别处理不同的属性。

Python中还有一个__getattribute__特殊方法,用于查询任意属性。__getattr__只能用来查询不在__dict__系统中的属性
__setattr__(self, name, value)和__delattr__(self, name)可用于修改和删除属性。它们的应用面更广,可用于任意属性

参考
python doc


您的鼓励是我写作最大的动力

俗话说,投资效率是最好的投资。 如果您感觉我的文章质量不错,读后收获很大,预计能为您提高 10% 的工作效率,不妨小额捐助我一下,让我有动力继续写出更多好文章。