当前位置: 首页 > Linux

Python中的描述符

时间:2023-04-06 03:33:59 Linux

回答了三个问题,描述符是什么?如何实现?使用场景?1.什么是描述符描述符是具有绑定行为的对象属性,它的属性访问会被描述符协议中的方法覆盖。这些方法是__get__、__set__和__delete__。如果为对象定义了这些方法中的任何一个,则将其视为描述符。__get__用于访问属性。它返回属性的值,或者如果请求的属性不存在则引发AttributeError异常。__set__将在属性分配操作中被调用。不会返回任何内容__delete__控制删除操作。不会返回内容二、描述符的实际方式2.1基于类创建#!/usr/bin/envpython#-*-coding:utf-8-*-#__author__='liaogaoxiang'classDescriptor(object):""""""def__init__(self):self._name=''def__get__(self,instance,owner):print("__get__")returnself._namedef__set__(self,instance,value):print("__set__")self._name=valuedef__delete__(self,instance):print("__delete__")delself._nameclassPerson(object):name=Descriptor()p=Person()print(p.name)p.name='liaogaoxiang'delp.name#print(p.name)2.2使用propety()函数#!/usr/bin/envpython#-*-coding:utf-8-*-#__author__='liao高翔'classPerson(object):def__init__(self):self._name=''deffget(self):print("Getting:%s"%self._name)returnself._namedeffset(self,value):print("Setting:%s"%value)self._name=value.title()deffdel(self):print("Deleting:%s"%self._name)delself._namename=property(fget,fset,fdel,"我是财产")p=Person()print(p.name)p.name='廖高祥'delp.name#print(p.name)2.3使用@property装饰器#!/usr/bin/envpython#-*-coding:utf-8-*-#__author__='liaogaoxiang'classPerson(object):""""""def__init__(self,name):self._name=name@propertydefname(self):print("get_name")returnself._name@name.setterdefname(self,value):print("set_name")self._name=value@name.deleterdefname(self):print("del_name")delself._namep=Person()print(p.name)p.name='liaogaoxiang'delp.name#print(p.name)3.描述符使用场景通过组合描述符,可以实现优雅的编程,允许创建Setters和Getters以及只读属性。基于值或类型请求的属性验证广泛应用于各种框架中,例如Django的模型搜索并关注微信公众号:ID:bbcoins