早期的Python版本中,我们一般用__getattr__()和__setattr__()来处理和属性相关的问题。属性的访问会涉及以上的方法(和__getattribute__()),但是如果用property()来处理这些问题,就可以写一个和属性有关的属性来处理实例属性的获取(getting)、赋值(setting)和删除(deleting)操作,就不必在使用那些特殊的方法了。
property()内建函数的四个参数,它们是:
property(fget=None, fset=None, fdel=None, doc=None)
实际上,property()是在它所在的类被创建时调用的,这些传进来的(作为参数的)方法是非绑定的,所以这些方法就是函数!
实例一:
class ProtectAndHideX(object):
def __init__(self,x):
assert isinstance(x,int),\
'"x" must be an integer!'
self.__x = ~x
def get_x(self):
return ~self.__x
x = property(get_x)
inst = ProtectAndHideX(10)
print "inst.x = ",inst.x
inst.x = 20
inst.x = 10
:
AttributeError: can't set attribute
class HideX(object):
def __init__(self,x):
self.x = x
def get_x(self):
return ~self.__x
def set_x(self,x):
assert isinstance(x,int),\
'"x" must be an integer!'
self.__x = ~x
x = property(get_x, set_x)
inst2 = HideX(10)
print inst2.x
inst2.x = 20
print inst2.x
10
20
实例三:
from math import pi
def get_pi(dummy):
return pi
class PI(object):
pi = property(get_pi,doc = 'Constant "pi"')
inst3 = PI()
print inst3.pi
print PI.pi.__doc__
3.14159265359
Constant "pi"
实例四:
class HideXX(object):
def __init__(self, x):
self.x = x
@property
def x():
def fget(self):
return ~self.__x
def fset(self,x):
assert isinstance(x,int),\
'"x" must be an integer!'
self.__x = ~x
return locals()
inst4 = HideXX(20)
print inst4.x
inst4.x = 40
print inst4.x
:
AttributeError: can't set attribute(至于为什么,还没搞明白,新式类继承自object反而不可以)
修改上述代码:
class HideXX:
def __init__(self, x):
self.x = x
@property
def x():
def fget(self):
return ~self.__x
def fset(self,x):
assert isinstance(x,int),\
'"x" must be an integer!'
self.__x = ~x
return locals()
inst4 = HideXX(20)
print inst4.x
inst4.x = 40
print inst4.x
2040
实例五:
class Student(object):
@property
def score(self):
return self._score
@score.setter
def score(self, value):
if not isinstance(value, int):
raise ValueError('score must be an integer!')
if value < 0 or value > 100:
raise ValueError('score must between 0 ~ 100!')
self._score = value
stu = Student()
stu.score = 20
print stu.score
20
REF:Core Python Programming