python使用@property与描述器详解及讨论
描述
python内置的@property函数,可以方便地将类的方法变成类的属性来调用
比如:
class Date(object):
_year = 0
@property
def year(self):
return self._year
@year.setter
def year(self, value):
if isinstance(value, int):
self._year = value
else:
raise TypeError('year must be integer!')
@year.deleter
def year(self):
raise AttributeError("Can't delete attribute")
调用时
>>>d = Date()
>>>d.year # 触发year.getter
0
>>>d.year = 2020 # 触发year.setter
>>>d.year
2020
>>>d.year = '2020'
TypeError: year must be integer!
若只实现了getter方法,则该属性只读,不可设置
class Date(object):
_month = 0
@property
def month(self):
return self._month
调用时
>>>d = Date()
>>>d.month # 触发month.getter
0
>>>d.month = 12 # 触发month.setter,由于没有实现setter,默认raise AttributeError
AttributeError: can't set attribute
虽然property函数很好用,但也请注意不要滥用,只有当你确实需要对attribute执行其他额外的操作的时候才应该使用到property,不要写这种没有做任何其他额外操作的property
class Date(object):
def __init__(self, month=0):
self._month = month
@property
def month(self):
return self._month
@month.setter
def month(self, value):
self._month = value
原因在于,这样写会让你的代码变得很臃肿,并且还会迷惑阅读者。 其次,它还会让你的程序运行起来变慢很多。 最后,这样的设计并没有带来任何的好处。 特别是当你以后想给普通attribute访问添加额外的处理逻辑的时候, 你可以将它变成一个property而无需改变原来的代码。 因为访问attribute的代码还是保持原样。