标签(空格分隔): Python
使用@property
在Python的官方帮助文档中有关于property类(built-in class)的说明(The Python Standard Library/2 Built-in Functions)
class Student(object):
def __init__(self,name='empty'):
self._name = name
def get_name(self):
return self._name
def set_name(self,name):
self._name = name
def del_name(self):
del self._name
name = property(get_name, set_name, del_name, 'i am the property sample')
foo = Student("xiaoming")
print (foo.name)
foo.name = 'haizhen'
print (foo.name)
del foo.name
通过上面的例子可以看出,property可以使得类属性的访问、设置即隐晦又直接(把普通的赋值语句与方法联系在一起)。因为property还可以作为装饰器,一个property对象有getter,setter,和deleter三个方法,因此对于上面的例子还可以有另外一种写法:
class Student(object):
def __init__(self,name='empty'):
self._name = name
@property
def name(self):
return self._name
@name.setter
def name(self,name):
self._name = name
@name.deleter
def name(self):
del self._name
foo = Student("xiaoming")
print (foo.name)
foo.name = 'haizhen'
print (foo.name)
del foo.name
如果不定义setter那么就相当于是一个只读属性:
class Student(object):
@property
def birth(self):
return self._birth
@birth.setter
def birth(self, value):
self._birth = value
@property
def age(self):
return 2015 - self._birth
上面的例子中,age就是只读的
练习:利用@property给一个Screen对象增加width与height属性,以及一个只读属性resolution
解答:
class Screen(object):
@property
def width(self):
return self._width
@width.setter
def width(self,width):
self._width = width
@property
def height(self):
return self._height
@height.setter
def height(self,height):
self._height = height
@property
def resolution(self):
return self._height * self._width
bar = Screen()
bar.width = 3480
bar.height = 2160
print(bar.resolution)