描述
property() 函数的作用是在新式类中返回属性值。
语法
以下是 property() 方法的语法:
class property([fget[, fset[, fdel[, doc]]]])
参数
- fget -- 获取属性值的函数
- fset -- 设置属性值的函数
- fdel -- 删除属性值函数
- doc -- 属性描述信息
返回值
返回新式类属性。
实例
class Student:
def __init__(self, name, math, chinese, english):
self.name = name
self.math = math
self.chinese = chinese
self.english = english
def get_math(self):
return self._math
def set_math(self, value):
if 0 <= value <= 100:
self._math = value
else:
raise 'valid value must be in [0,100]'
def get_chinese(self):
return self._chinese
def set_chinese(self, value):
if 0 <= value <= 100:
self._chinese = value
else:
raise 'valid value must be in [0,100]'
def get_english(self):
return self._english
def set_english(self, value):
if 0 <= value <= 100:
self._english = value
else:
raise 'valid value must be in [0,100]'
math=property(get_math, set_math, "", "I'm the 'math' property.")
chinese=property(get_chinese, set_chinese, "", "I'm the 'chinese' property.")
english=property(get_english, set_english, "", "I'm the 'english' property.")
def __repr__(self):
return '<student:{} ,math:{}, chinese:{}, english:{}>'.format(self.name, self.math, self.chinese, self.english)
将property用做装饰器
@property是一个非常好用的语法糖,@property最大的好处就是在类中把一个方法变成属性调用,起到既能检查属性,还能用属性的方式来访问该属性的作用。
class Student:
def __init__(self, name, math, chinese, english):
self.name = name
self.math = math
self.chinese = chinese
self.english = english
@property
def math(self):
return self._math
@math.setter
def math(self, value):
if 0 <= value <= 100:
self._math = value
else:
raise 'valid value must be in [0,100]'
@property
def chinese(self):
return self._chinese
@chinese.setter
def chinese(self, value):
if 0 <= value <= 100:
self._chinese = value
else:
raise 'valid value must be in [0,100]'
@property
def english(self):
return self._english
@english.setter
def english(self, value):
if 0 <= value <= 100:
self._english = value
else:
raise 'valid value must be in [0,100]'
def __repr__(self):
return '<student:{} ,math:{}, chinese:{}, english:{}>'.format(self.name, self.math, self.chinese, self.english)
这个代码和第一个例子完全相同
- 利用@property还可以只定义只读属性,既只定义getter方法
- setter方法可以认为是可写属性
@property实现原理
源码
class property(object):
def __init__(self, fget=None, fset=None, fdel=None, doc=None):
“”“
Property attribute.
fget
function to be used for getting an attribute value
fset
function to be used for setting an attribute value
fdel
function to be used for del'ing an attribute
class C(object):
@property
def x(self):
"I am the 'x' property."
return self._x
@x.setter
def x(self, value):
self._x = value
@x.deleter
def x(self):
del self._x
”“”
pass
def __set__(self, *args, **kwargs): # real signature unknown
""" Set an attribute of instance to value. """
pass
def __get__(self, *args, **kwargs): # real signature unknown
""" Return an attribute of instance, which is of type owner. """
pass
def __delete__(self, *args, **kwargs): # real signature unknown
""" Delete an attribute of instance. """
pass
@property是一个描述符,以后会讲到







Comments | NOTHING