Python笔记(二十五)_魔法方法_描述符
2024-08-26 00:32:29
描述符的属性方法
__get__(self, instance, owner): 用于访问属性,返回属性的值
__set__(self, instance, value): 用于给属性赋值时,返回属性的值
__delete__(self, instance): 用于删除属性时,不返回任何内容
将某种特殊类型的类的实例指派给另一个类的属性(注意:是类属性,不是实例属性),而这种特殊类型的类是实现了__get__,__set__,__delete__这三个方法中的一个或多个,此时这个实例被称为描述符,而被指派属性的类叫做描述符类
描述符优点:保护属性不受修改、属性类型检查和自动更新某个依赖属性的值等。
>>>class Desc: #Desc是包含了三种方法中任意个的特殊类型的类
def __get__(self,instance,owner):
print('getting',self,instance,owner)
def __set__(self,instance,value):
print('setting',self,instance,value)
def __delete__(self,instance):
print('deleting',self,instance)
>>>class MyDesc(): #MyDesc这个类叫描述符类
>>>x = Desc() #类对象被指派给其他类作为属性,此时Desc()就是一个描述符
>>>mydesc = MyDesc()
>>>mydesc.x
getting <__main__.Desc object at 0x0000024A437D8F98> <__main__.MyDesc object at 0x0000024A43857EB8> <class '__main__.MyDesc'>
>>>mydesc.x = 1
setting <__main__.Desc object at 0x0000024A437D8F98> <__main__.MyDesc object at 0x0000024A43857EB8> 1
>>>del mydesc.x
deleting <__main__.Desc object at 0x0000024A437D8F98> <__main__.MyDesc object at 0x0000024A43857EB8>
self: Desc object -> Desc的实例化对象,指的是x
instance: MyDesc -> MyDesc的实例化对象,指的是mydesc
owner: MyDesc -> 指的就是MyDesc类
>>>class MyDes:
def __init__(self,values,attr):
self.values = values
self.attr = attr
def __get__(self,instance,owner):
print('正在获取变量:',self.attr)
return self.values
def __set__(self,instance,value):
print('正在修改变量:',self.attr)
self.values = value
def __delete__(self,instance):
print('正在删除变量:',self.attr)
print('唔,这个变量没法删除')
>>>class Test:
x=MyDes(10,'x')
>>>test = Test()
>>>test.x
10
>>>test.x=8
正在修改变量: x
>>>test.x
8
>>>del test.x
正在删除变量: x
这个变量没法删除
>>>test.x
8
最新文章
- android 网络请求库的比较
- JS定时程序,设定一个一直刷新,又时间间隔的js,读取当前的时间并显示
- Google earth
- 单机运行环境搭建之 --CentOS-6.5安装配置Tengine
- BZOJ3211 花神游历各国
- Cmake设置环境变量
- docker的一些命令
- node+vue进阶【课程学习系统项目实战详细讲解】打通前后端全栈开发(1):创建项目,完成登录功能
- scala中Either的一种使用场景
- Python学习(六) —— 函数
- SQLSERVER安装
- Matlab-4:追赶法(crout分解)工具箱
- OpenStack Nova虚拟机创建流程解析
- 使用PerfView监测.NET程序性能(三):分组
- 【Jenkins】安装插件
- JAXB--@XmlElementWrapper注解和泛型一起使用
- stenciljs 学习十 服务器端渲染
- Object-C 类和对象
- How to set JAVA environment variables in Linux or CentOS
- web.xml servlet、servlet-mapping配置