attribute
首先把attribute
理解为属性,property
理解为属性函数。
举例1:
class Student(object):
#把一个getter方法变成属性,只需要加上@property就可以了
@property
def score(self):
#名称前的单下划线,用于指定该名称属性为“私有”。
return self._score
#@property本身又创建了另一个装饰器@score.setter
@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
#只读属性
@property
def age(self):
return 2015 - self._birth
s = Student()
s.score = 5
s.score=111
想要的输出报错:
ValueError: score must between 0 ~ 100!
举例2:
class Screen(object):
@property
def width(self):
return self._width
@width.setter
def width(self, value):
if not isinstance(value,int):
raise ValueError("Width must be an integer!")
self._width = value
@property
def height(self):
return self._height
@height.setter
def height(self, value):
if not isinstance(value, int):
raise ValueError("Height must be an integer!")
self._height = value
#只读属性
@property
def resolution(self):
return self._height * self._width
测试:
# 测试:
s = Screen()
s.width = 1024
s.height = 768
print('resolution =', s.resolution)
if s.resolution == 786432:
print('测试通过!')
else:
print('测试失败!')
举例3:
参考https://www.zhihu.com/question/40015172):
定义一个圆,有半径和直径:
class Circle(object):
#直径半径都设置为attribute
def __init__(self, radius,diameter):
self.radius = radius
self.diameter = diameter
实例化:
class Circle(object):
def __init__(self, radius,diameter):
self.radius = radius
self.diameter = diameter
my_circle = Circle(2,4)
print('radius is {}'.format(my_circle.radius))
print('diameter is {}'.format(my_circle.diameter))
#change the radius into 6
my_circle.radius = 6
print('radius is {}'.format(my_circle.radius))
print('diameter is {}'.format(my_circle.diameter))
结果:
radius is 2
diameter is 4
radius is 6
diameter is 4
property
上面的输出看出明显直径和半径对不上,修改用property
的代码:
class Circle(object):
def __init__(self, radius):
self.radius = radius
@property
def diameter(self):
return self.radius * 2
@diameter.setter
def diameter(self, new_diameter):
self.radius = new_diameter / 2
my_circle = Circle(2)
print('radius is {}'.format(my_circle.radius))
print('diameter is {}'.format(my_circle.diameter))
#change the radius into 6
my_circle.radius = 6
print('radius is {}'.format(my_circle.radius))
print('diameter is {}'.format(my_circle.diameter))
#change the diameter into 6
my_circle.diameter = 6
print('radius is {}'.format(my_circle.radius))
print('diameter is {}'.format(my_circle.diameter))
输出:
radius is 2
diameter is 4
radius is 6
diameter is 12
radius is 3.0
diameter is 6.0