Python描述符以及Property方法的实现原理

描述符的定义:

描述符是什么:描述符本质就是一个新式类,在这个新式类中,至少实了__get__(),__set__(),__delete__()中的一个,这也被称为描述符协议

__get__():调用一个属性时,触发

__set__():为一个属性赋值时,触发

__delete__():采用del删除属性时,触发

描述符作用:

描述符的作用是用来代理另外一个类的属性的(必须把描述符定义成这个类的类属性,不能定义到构造函数中)

可以说成是属性的属性,定义属性的属性

描述符本身的实例并不会触发这三个方法

class dis:
def __set__(self, instance, value):
print('正在执行__set__方法.....') def __delete__(self, instance):
print('正在执行__delete__方法') def __get__(self, instance, owner):
print('正在执行__get__方法') d = dis()
d.name = "1"
print(d.name)
del d.name #================输出===================
1

描述符解析

分析代码

class dis:
def __init__(self, fget, fset, fdel):
self.fget = fget
self.fset = fset
self.fdel = fdel
print('正在执行__init__方法.....') def __set__(self, instance, value):
print('正在执行__set__方法.....')
print(instance, value) def __delete__(self, instance):
print('正在执行__delete__方法')
print(instance) def __get__(self, instance, owner):
print('正在执行__get__方法')
print(instance, owner) class test:
def __init__(self, value = 10):
self.value = value
def fset(self, value):
self.value = value
def fget(self):
return self.value
def fdel(self):
del self.value x = dis(fget, fset, fdel) t = test()
print(t.x)
t.x = 20
print(t.x)
del t.x

输出

正在执行__init__方法.....
正在执行__get__方法
<__main__.test object at 0x0000016CA299CEE0> <class '__main__.test'>
None
正在执行__set__方法.....
<__main__.test object at 0x0000016CA299CEE0> 20
正在执行__get__方法
<__main__.test object at 0x0000016CA299CEE0> <class '__main__.test'>
None
正在执行__delete__方法
<__main__.test object at 0x0000016CA299CEE0>

当test类试图去通过x属性来访问自身的value属性时,就会自动跳转到执行dis类里面的__get__方法。

当试图通过x去修改value的属性时就会执行dis类里面的__set__方法。

当试图通过x去删除value的属性时会执行dis类里面的__del__方法。

然后我把它们的参数类型打印出来可以知道;

instance参数指的是test类的实例化对象t;

owner指的是test类;

因为这几个方法我只是把值给打印出来,并未给出有效操作的代码,就返回值一直是None知道了上面之后我们可以实现property方法。

class dis:
def __init__(self, fget = None, fset = None, fdel = None):
self.fget = fget
self.fset = fset
self.fdel = fdel def __set__(self, instance, value):
self.fset(instance, value)#这里fset的参数类型看test里面的fset就行,鸭子类型 def __delete__(self, instance):
self.fdel(instance) def __get__(self, instance, owner):
return self.fget(instance)

以上大概就是property方法,然后再加上测试的代码

class test:
def __init__(self, value = 10):
self.value = value
def fset(self, value):
self.value = value
def fget(self):
return self.value
def fdel(self):
del self.value x = dis(fget, fset, fdel) t = test()
print(t.x)
t.x = 20
print(t.x)
del t.x
try:
print(t.x)
except AttributeError as reason:
print("出错啦"+str(reason))

这里是输出结果:

10
20
出错啦'test' object has no attribute 'value'

Python描述符以及Property方法的实现原理的更多相关文章

  1. Python描述符:property()函数的小秘密

    描述符:将某种特殊类型的类的实例指派给另一个类的属性(注意:这里是类属性,而不是对象属性).而这种特殊类型的类就是实现了__get__,__set__,__delete__这三个方法中的一个或多个的新 ...

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

     1.前言 Python的描述符是接触到Python核心编程中一个比较难以理解的内容,自己在学习的过程中也遇到过很多的疑惑,通过google和阅读源码,现将自己的理解和心得记录下来,也为正在为了该问题 ...

  3. 课时46:魔法方法:描述符(property的原理)

    目录: 一.描述符(property的原理) 二.课时46课后习题及答案 ********************************** 一.描述符(property的原理) ********* ...

  4. 【转载】Python 描述符简介

    来源:Alex Starostin 链接:www.ibm.com/developerworks/cn/opensource/os-pythondescriptors/ 关于Python@修饰符的文章可 ...

  5. Python描述符的使用

    Python描述符的使用 前言 作为一位python的使用者,你可能使用python有一段时间了,但是对于python中的描述符却未必使用过,接下来是对描述符使用的介绍 场景介绍 为了引入描述符的使用 ...

  6. python描述符学习

    目录 一.对象属性的访问控制 二.描述符基本理解 三.基本使用 四.使用描述符完成property.classmethod.staticmethod自定义实现 1.property的自定义实现 2.c ...

  7. Python 描述符 (descriptor)

    1.什么是描述符? 描述符是Python新式类的关键点之一,它为对象属性提供强大的API,你可以认为描述符是表示对象属性的一个代理.当需要属性时,可根据你遇到的情况,通过描述符进行访问他(摘自Pyth ...

  8. 杂项之python描述符协议

    杂项之python描述符协议 本节内容 由来 描述符协议概念 类的静态方法及类方法实现原理 类作为装饰器使用 1. 由来 闲来无事去看了看django中的内置分页方法,发现里面用到了类作为装饰器来使用 ...

  9. python描述符理解

    Python中的描述符是一个相对底层的概念 descriptor Any object which defines the methods get(), set(), or delete(). Whe ...

随机推荐

  1. SpringBoot-集成SpringSecurity

    在 Web 开发中,安全一直是非常重要的一个方面. 安全虽然属于应用的非功能性需求,但是从应用开发的第一天就应该把安全相关的因素考虑进来,并在整个应用的开发过程中. Spring Security官网 ...

  2. SpringBoot整合JDBC-调用数据库

    SpringData 对于数据访问层,无论是 SQL(关系型数据库) 还是 NOSQL(非关系型数据库),Spring Boot 底层都是采用 Spring Data 的方式进行统一处理. Sprin ...

  3. 【Java虚拟机9】类加载器之命名空间详解

    前言 前面介绍类加载器的时候,介绍了一下命名空间这个概念.今天就通过一个例子,来详细了解一下[类加载器的命名空间].然后通过这个例子,我们可以总结一下双亲委托模型的好处与优点. 例1(不删除class ...

  4. Jmeter之BeanShell 断言

    作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15436864.html 博客主页:https://www.cnblogs.com/testero ...

  5. mysql all_ip_test局域网IP测试工具,有需要的改一改.

    1 import threading 2 import subprocess 3 import pymysql 4 # threading.Lock() 5 6 7 class Link(object ...

  6. [软工顶级理解组] 团队规划和任务拆解(Beta)

    目录 需求再分析 功能增减 管理改进 任务分解 人员管理 需求再分析 在Alpha阶段,我们的产品得到了用户的广泛好评,但是还是存在一些问题. 登录不稳定,登录速度慢等问题:这是北航VPN本身的不稳定 ...

  7. Scrum Meeting 15

    第15次例会报告 日期:2021年06月09日 会议主要内容概述: 开发工作接近尾声,接下来两天重点放在单元测试.调CSS和增加数据集数量上. 一.进度情况 我们采用日报的形式记录每个人的具体进度,链 ...

  8. spring security中ajax超时处理

    spring security为我们的系统提供了方便的认证和授权操作.在系统中完成认证和授权后,一般页面页面上大多数是ajax和后台进行操作,那么这个时候可能就会面临session超时,ajax去访问 ...

  9. 2021.6.29考试总结[NOIP模拟10]

    T1 入阵曲 二位前缀和暴力n4可以拿60. 观察到维护前缀和时模k意义下余数一样的前缀和相减后一定被k整除,前缀和维护模数,n2枚举行数,n枚举列, 开一个桶记录模数出现个数,每枚举到该模数就加上它 ...

  10. Maven还停留在导jar包?快来探索Nexus私服的新世界

    写在前面 Maven,学习框架之前我们都会接触到的一个工具,感觉他的定位,似乎就跟git一样,只是方便我们开发?于是自然而然的,很多小猿对于Maven都只是停留在会用的阶段,利用他来构建,打包,引入j ...