Python装饰器之property
2022/5/3 17:13:09
本文主要是介绍Python装饰器之property,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
我们一直在用“类对象.属性”的方式访问类中定义的属性,其实这种做法是欠妥的,因为它破坏了类的封装原则。正常情况下,类包含的属性应该是隐藏的,只允许通过类提供的方法来间接实现对类属性的访问和操作。
操作类属性
在不破坏类封装原则的基础上,为了能够有效操作类中的属性,类中应包含读(或写)类属性的多个 getter(或 setter)方法,这样就可以通过“类对象.方法(参数)”的方式操作属性
class Student: def __init__(self, name): self.name = name def set_name(self, name): self.name = name def get_name(self): return self.name def del_name(self): self.name = "xxx" student = Student("Python") print(student.get_name()) student.set_name("Java") print(student.get_name()) student.del_name() print(student.get_name()) ### 运行结果 Python Java xxx
property() 函数
上面这种操作类属性的方式比较麻烦,我们更习惯于使用“类对象.属性”这种方式,Python 中提供了 property() 函数,可以实现在不破坏类封装原则的前提下,让开发者依旧使用“类对象.属性”的方式操作类中的属性。
property() 函数的基本使用格式如下:
属性名 = property(fget=None, fset=None, fdel=None, doc=None) 在使用 property() 函数时,以上 4 个参数可以仅指定第 1 个、或者前 2 个、或者前 3 个,当前也可以全部指定。也就是说,property() 函数中参数的指定并不是完全随意的。
想要有写和删的权限必须要有读的权限,否则报错 name = property(getname) # name 属性可读,不可写,也不能删除 name = property(getname, setname) # name属性有读、写的权限,但是不能删除 name = property(getname, setname,delname) #name属性可读、可写、也可删除,就是没有说明文档
class Students: def __init__(self, name): self.__name = name def set_name(self, name): self.__name = name def get_name(self): return self.__name def del_name(self): self.__name = "xxx" # 为name 属性配置 property() 函数 name = property(get_name, set_name, del_name, '指明出处') # 调取说明文档的 2 种方式 print(Students.name.__doc__) help(Students.name) student = Students("C语言") print(student.name) student.name = "Python教程" print(student.name) del student.name print(student.name) ### 运行结果 指明出处 Help on property: 指明出处 C语言 Python教程 xxx
注意,在此程序中,由于 getname() 方法中需要返回 name 属性,如果使用 self.name 的话,其本身又被调用 getname(),这将会先入无限死循环。为了避免这种情况的出现,程序中的 name 属性必须设置为私有属性,即使用 __name(前面有 2 个下划线)。
property装饰器用法
class Rect: def __init__(self, area): self.__area = area @property # 只读权限 def area(self): return self.__area @area.setter # 拥有读写权限,前提是上面一定有property(要用只读),否则报错 def area(self, value): self.__area = value @area.deleter # 拥有删除权限,前提是上面一定有property(要用只读),否则报错 def area(self): del self.__area rect = Rect(30) print("初始化的area值是:", rect.area) rect.area = 90 print("修改后的area值是:", rect.area) del rect.area print("删除后的area值是:", rect.area) ### 运行结果: 初始化的area值是: 30 修改后的area值是: 90 Traceback (most recent call last): File "tests.py", line 60, in <module> print("删除后的area值是:", rect.area) File "tests.py", line 44, in area return self.__area AttributeError: 'Rect' object has no attribute '_Rect__area'
这篇关于Python装饰器之property的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-21Python编程基础教程
- 2024-11-20Python编程基础与实践
- 2024-11-20Python编程基础与高级应用
- 2024-11-19Python 基础编程教程
- 2024-11-19Python基础入门教程
- 2024-11-17在FastAPI项目中添加一个生产级别的数据库——本地环境搭建指南
- 2024-11-16`PyMuPDF4LLM`:提取PDF数据的神器
- 2024-11-16四种数据科学Web界面框架快速对比:Rio、Reflex、Streamlit和Plotly Dash
- 2024-11-14获取参数学习:Python编程入门教程
- 2024-11-14Python编程基础入门