背景我们在以前的一篇图文 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 # 删除年龄数据!
上例中的第一个age(self) 方法,这样就使得该方法变成了age 属性的getter 方法。需要注意的是,如果类中只包含该方法,那么age 属性将是一个只读属性。 上例中的第二个age(self, age) 方法,这样就使得该方法变成了age 属性的setter 方法,提供赋值功能。 上例子中第三个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!
参考文献
|