描述符(__get__,__set__,__delete__)

4 注意事项:
一 描述符本身应该定义成新式类,被代理的类也应该是新式类
二 必须把描述符定义成这个类的类属性,不能为定义到构造函数中
三 要严格遵循该优先级,优先级由高到底分别是
1.类属性
2.数据描述符
3.实例属性
4.非数据描述符
5.找不到的属性触发__getattr__()

1 描述符是什么:描述符本质就是一个新式类,在这个新式类中,至少实现了__get__(),__set__(),__delete__()中的一个,这也被称为描述符协议
__get__():调用一个属性时,触发
__set__():为一个属性赋值时,触发
__delete__():采用del删除属性时,触发

class Foo: #在python3中Foo是新式类,它实现了三种方法,这个类就被称作一个描述符def __get__(self, instance, owner):passdef __set__(self, instance, value):passdef __delete__(self, instance):pass定义一个描述符

2 描述符是干什么的:描述符的作用是用来代理另外一个类的属性的(必须把描述符定义成这个类的类属性,不能定义到构造函数中)class Foo:def __get__(self, instance, owner):print('触发get')def __set__(self, instance, value):print('触发set')def __delete__(self, instance):print('触发delete')#包含这三个方法的新式类称为描述符,由这个类产生的实例进行属性的调用/赋值/删除,并不会触发这三个方法
f1=Foo()
f1.name='egon'
f1.name
del f1.name
#疑问:何时,何地,会触发这

#描述符Str
class Str:def __get__(self, instance, owner):print('Str调用')def __set__(self, instance, value):print('Str设置...')def __delete__(self, instance):print('Str删除...')#描述符Int
class Int:def __get__(self, instance, owner):print('Int调用')def __set__(self, instance, value):print('Int设置...')def __delete__(self, instance):print('Int删除...')class People:name=Str()age=Int()def __init__(self,name,age): #name被Str类代理,age被Int类代理,self.name=nameself.age=age#何地?:定义成另外一个类的类属性
#何时?:且看下列演示

p1=People('alex',18)#描述符Str的使用
p1.name
p1.name='egon'
del p1.name#描述符Int的使用
p1.age
p1.age=18
del p1.age#我们来瞅瞅到底发生了什么
print(p1.__dict__)
print(People.__dict__)#补充
print(type(p1) == People) #type(obj)其实是查看obj是由哪个类实例化来的
print(type(p1).__dict__ == People.__dict__)
# 描述符应用之何时?何地?三个方法的执行\
# 执行顺序
# Str设置...
# Int设置...
# Str调用
# Str设置...
# Str删除...
# Int调用
# Int设置...
# Int删除...
# {}
# {'__module__': '__main__', 'name': <__main__.Str object at 0x00000177DAFD5048>, 'age': <__main__.Int object at 0x00000177DAFD5080>, '__init__': <function People.__init__ at 0x00000177DAFCAEA0>, '__dict__': <attribute '__dict__' of 'People' objects>, '__weakref__': <attribute '__weakref__' of 'People' objects>, '__doc__': None}
# True
# True

二 .描述符分两种

  1.  数据描述符:至少实现了__get__()和__set__()

一 数据描述符:至少实现了__get__()和__set__()1 class Foo:
2     def __set__(self, instance, value):
3         print('set')
4     def __get__(self, instance, owner):
5         print('get')
# 实例属性是低于 数据描述符   所以优先找的是描述符属性   优先级

class Foo:    def __set__(self, instance, value):        print('set')        print(value)    def __get__(self, instance, owner):        print('get')        print(owner)class Per(object):    name=Foo()    def __init__(self,name):        self.name=name    def aa(self):        print(self.name)

f=Per("李四")f.namef.aa()# # get# <class '__main__.Per'># get# <class '__main__.Per'># None

2. 非数据描述符:没有实现__set__()

1 class Foo:
2     def __get__(self, instance, owner):
3         print('get')
# 实例属性是高于 非数据描述符   所以优先找的是实例属性    这就是优先级class Foo:   def __get__(self, instance, owner):     print('get')class Per(object):    name=Foo()    def __init__(self,name):        self.name=name    def aa(self):        print(self.name)f=Per("李四")print(f.name)print(f.__dict__)print(Per.__dict__)

# 李四# {'name': '李四'}# {'__module__': '__main__', 'name': <__main__.Foo object at 0x00000268526C8860>, '__init__': <function Per.__init__ at 0x00000268526CABF8>, 'aa': <function Per.aa at 0x00000268526CAD08>, '__dict__': <attribute '__dict__' of 'Per' objects>, '__weakref__': <attribute '__weakref__' of 'Per' objects>, '__doc__': None}

 案例

众所周知,python是弱类型语言,即参数的赋值没有类型限制,下面我们通过描述符机制来实现类型限制功能
# 这是利用描述符来 来做 实例化属性 类型的判断
class Typed:def __init__(self,name,expected_type):self.name=nameself.expected_type=expected_typedef __get__(self, instance, owner):if instance is None:return selfreturn instance.__dict__[self.name]def __set__(self, instance, value):if not isinstance(value,self.expected_type):raise TypeError('Expected %s' %str(self.expected_type))instance.__dict__[self.name]=valuedef __delete__(self, instance):instance.__dict__.pop(self.name)
# 这是利用描述符来 来做 实例化属性 类型的判断
class People:name=Typed('name',str)age=Typed('age',int)salary=Typed('salary',float)def __init__(self,name,age,salary):self.name=nameself.age=ageself.salary=salarydef aa(self):print(self.name)
p1=People('张三',18,3333.3)
print(p1.__dict__)
p1.aa()

转载于:https://www.cnblogs.com/Sup-to/p/11087506.html

十八.描述符(__get__,__set__,__delete__)相关推荐

  1. python六十五:描述符(__get__, __set__, __delete__)

    优先级: 1. 类属性  2. 数据描述符  3. 实例属性  4. 非数据描述符  5.找不到的属性触发__getattr()__

  2. python __set__ __get___python3面对像进阶——描述符(__get__,__set__,__delete__)

    描述符只实用于大型框架 1.描述符是什么? 描述符本质就是一个新式类,在这个新式类中,至少实现了__get__(),__set__(),__delete__()中的一个,这也被称为描述符协议 __ge ...

  3. Python之路(第二十七篇) 面向对象进阶:内置方法、描述符

    一.__call__ 对象后面加括号,触发执行类下面的__call__方法. 创建对象时,对象 = 类名() :而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()( ...

  4. 技术图文:Python描述符 (descriptor) 详解

    背景 今天在B站上学习"零基础入门学习Python"这门课程的第46讲"魔法方法:描述符",这也是我们组织的 Python基础刻意练习活动 的学习任务,其中有这 ...

  5. python描述符(descriptor)、属性(property)、函数(类)装饰器(decorator )原理实例详解

    2019独角兽企业重金招聘Python工程师标准>>> 1.前言 Python的描述符是接触到Python核心编程中一个比较难以理解的内容,自己在学习的过程中也遇到过很多的疑惑,通过 ...

  6. Python全栈开发——描述符

    6.描述符(__get__,__set__,__delete__) 定义:描述符本质就是一个新式类,在新式类中,至少实现了(__get__,__set__,__delete__)中的一个:这也被称为描 ...

  7. python 属性描述符

    文章目录 1. 描述符示例:验证属性 2. 自动获取储存属性的名称 3. 继承改进 4. 覆盖型与非覆盖型描述符对比 4.1 覆盖型描述符 4.2 没有 `__get__` 方法的覆盖型描述符 4.3 ...

  8. python描述符详解_Python描述符 (descriptor) 详解

    1.什么是描述符? python描述符是一个"绑定行为"的对象属性,在描述符协议中,它可以通过方法重写属性的访问.这些方法有 __get__(), __set__(), 和__de ...

  9. python 描述符类_python的黑魔法--描述符

    python的黑魔法 描述符 官方定义:python描述符是一个"绑定行为"的对象属性,在描述符协议中,它可以通过方法重写属性的访问.这些方法有 get(), set(), 和de ...

  10. 有效的python属性管理:描述符的使用

    前言 最近使用描述符对自己的催化动力学模拟程序进行了改进,在Python描述符的帮助下实现了更加灵活而且强大有效的属性管理,使得程序各个组件的数据封装更加完善管理也更加有条理. 本文就以自己程序中运用 ...

最新文章

  1. python创建线程_多种方法实现 python 线程池
  2. 【Flashback】Flashback Database闪回数据库功能实践
  3. java farm tycoon_Idle Farm Tycoon
  4. 数据倾斜?几招把你安排的板板正正的!
  5. 最大计算机病毒诈骗怎么发生,又是怎么被制止的
  6. 用scikit-learn进行LDA降维
  7. yum,yum指向,yum源创建
  8. 使用 bibexcel 把.out 文件转换成 .net 文件
  9. 综合布线(楼栋)需求分析报告
  10. 嵌入式系统应用开发实验(三): Verilog编程使VGA图像输出
  11. Aspose.Barcode创建二维码应用代码示例
  12. NLP常见词/典汇总
  13. python表情包多样化图形化聊天室_Python还有这功能:自动生成表情包,从此斗图无敌手!...
  14. 国际象棋棋盘 java_java打印国际象棋棋盘的方法
  15. 5月30日第壹简报,星期一,农历五月初一
  16. 华为平板鸿蒙发布,华为新款平板与P50一同发布!有望搭载鸿蒙系统
  17. 准考证打印电脑记录怎么删除
  18. 更改MySQL数据库root密码
  19. 2019-11-2-记一次调试资源管理器未响应经验
  20. 自然语言处理常见算法与模型

热门文章

  1. UIScrollView与分页的联合使用
  2. 关于TcpClient,Socket连接超时的几种处理方法
  3. 多重操作系统安装全解析
  4. 北语在SemEval 2022释义建模任务上斩获佳绩
  5. 在属性级情感分析中结合BERT和语法信息
  6. 【CNN长文详解】大话卷积神经网络CNN(干货满满)
  7. Python学习——collections系列
  8. [COLING18]两种成分句法分析的局部特征模型
  9. 内置函数——hasattr() 函数
  10. 深度学习----一文搞懂激活函数(Sigmoid/ReLU/LeakyReLU/PReLU/ELU)