背景
我们在以前的一篇图文 Python基础 – Task10. 类与对象 中介绍过利用property()
方法既能保护类的封装特性,又能让开发者可以使用“对象.属性”的方式操作类属性。
class property([fget[, fset[, fdel[, doc]]]])
用于在新式类中返回属性值。
- fget – 获取属性值的函数
- fset – 设置属性值的函数
- fdel – 删除属性值函数
- doc – 属性描述信息
并在图文 Python魔法方法之属性访问详解 中详细介绍了property()
方法的实现机理。
除了使用property()
方法,Python还提供了属性装饰器。通过这些属性装饰器,可以直接利用方法名来访问方法,不需要在方法名后添加一对“()”小括号。
@property
def 方法名(self)
代码块
@方法名.setter
def 方法名(self, value):
代码块
@方法名.deleter
def 方法名(self):
代码块
代码演示
1. Python属性装饰器举例
class People:
def __init__(self, name, age):
self.__name = name
self.__age = age if age > 0 else 0
@property
def age(self):
return self.__age
@age.setter
def age(self, age):
if isinstance(age, int):
self.__age = age if age > 0 else 0
else:
raise ValueError
@age.deleter
def age(self):
print('删除年龄数据!')
obj = People('jack', 18)
print(obj.age) # 获取值
obj.age = 19 # 重新赋值
print('obj.age:', obj.age)
del obj.age # 删除属性
# 18
# obj.age: 19
# 删除年龄数据!
@property
装饰器
上例中的第一个age(self)
方法,这样就使得该方法变成了age
属性的getter
方法。需要注意的是,如果类中只包含该方法,那么age
属性将是一个只读属性。
@xxx.setter
装饰器
上例中的第二个age(self, age)
方法,这样就使得该方法变成了age
属性的setter
方法,提供赋值功能。
@xxx.delete
装饰器
上例子中第三个age(self)
方法,这样就使得该方法变成了age
属性的deleter
方法,用于删除功能。
2. 使用property()
函数
class People:
def __init__(self, name, age):
self.__name = name
self.__age = age if age > 0 else 0
def get_age(self):
return self.__age
def set_age(self, age):
if isinstance(age, int):
self.__age = age if age > 0 else 0
else:
raise ValueError
def del_age(self):
print("删除年龄数据!")
age = property(get_age, set_age, del_age, "年龄")
obj = People('jack', 18)
print(obj.age)
obj.age = 19
print('obj.age:', obj.age)
del obj.age
# 18
# obj.age: 19
# 删除年龄数据!
总结
本图文介绍了Python中三种属性装饰器,并通过案例演示了这三种属性装饰器的使用方法,并利用property()
方法实现了相同的功能。今天就到这里吧!See You!
参考文献
- http://c.biancheng.net/view/4561.html
- http://www.liujiangblog.com/course/python/
往期活动
LSGO软件技术团队会定期开展提升编程技能的刻意练习活动,希望大家能够参与进来一起刻意练习,一起学习进步!