python中的@property详解
@property是Python的一种装饰器,它可以让一个办法像属性一样被使用,而不必要在调用的时分带上括号。如此可以便利地对属性举行拜候和修正,同时也可以对属性举行预处理和反省。
使用@property有以下几个利益:
- 可以保护类的属性,避免被随意修正或删除。
- 可以完成属性的动态更新,依据其他属性的厘革而厘革。
- 可以对属性举行验证和转换,确保属性的合法性和一律性。
使用@property必要依照以下几个端正:
- @property装饰器应该放在办法的界说外表,办法的称呼应该与要交换的属性名相反。
- @property装饰器会创建一个只读属性,假如要完成可写属性,必要再界说一个与之对应的@办法名.setter装饰器。
- @property装饰器和@办法名.setter装饰器应该紧挨着界说,且办法名应该一律。
- 假如要完成可删除属性,必要再界说一个与之对应的@办法名.deleter装饰器。
底下是一个使用@property的简便示例:
class Person(object):
def __init__(self, name, age):
self._name = name # 用下划线开头表现公有属性
self._age = age
@property # 界说一个只读属性name
def name(self):
return self._name
@property # 界说一个只读属性age
def age(self):
return self._age
@age.setter # 界说一个可写属性age
def age(self, value):
if not isinstance(value, int): # 对输入的值举行验证
raise ValueError('age must be an integer')
if value < 0 or value > 120: # 对输入的值举行限定
raise ValueError('age must be between 0 and 120')
self._age = value # 对输入的值举行赋值
@age.deleter # 界说一个可删除属性age
def age(self):
del self._age # 删除公有属性_age
p = Person('Alice', 18) # 创建一个Person目标
print(p.name) # 拜候只读属性name
print(p.age) # 拜候只读属性age
p.age = 20 # 修正可写属性age
print(p.age) # 再次拜候只读属性age
del p.age # 删除可删除属性age
print(p.age) # 报错:AttributeError: 'Person' object has no attribute '_age'