1、概览
@property 可以让把【方法】当做【属性】调用
# 方法源码
class Student(object):
def get__score(self):
return self.__score
def set__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
# 添加@property
class Student(object):
@property # @property:把一个getter方法变成属性
def score(self):
return self.__score
@score.setter # @score.setter:把一个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
注意:
上面定义的两个方法 score,在经过@property 和 @score.setter 后,就变成了score属性。
函数名在这里意义不大,它只是为了转化为属性后方便我们调用。
通过dir(),对比两个代码的instance,可以很容易看出方法到属性的变化
用了@property后,不能再随意的给 instance 添加属性了。
比如上面的代码。s.name='bart',会报错
2、例子
1、请利用@property给一个Screen对象加上width和height属性,以及一个只读属性resolution:
# -*- coding: utf-8 -*-
class Screen(object):
@property
def width(self):
return __width
@width.setter
def width(self,value):
self.__width=value
@property
def height(self):
return __height
@height.setter
def height(self,value):
self.__height=value
@property
def resolution(self):
self.__resolution=self.__width * self.__height
return self.__resolution
# 测试:
s = Screen()
s.width = 1024
s.height = 768
print('resolution =', s.resolution)
if s.resolution == 786432:
print('测试通过!')
else:
print('测试失败!')
原文地址:http://blog.51cto.com/12758568/2116782