python描述器的分类

  • 时间:
  • 3833人关注

python描述器分类:1、非数据描述器,只对类属性产生作用。当访问类属性时,将调用描述器的__get__方法;2、数据描述器,针对类属性和实例属性都产生作用。,另外这篇文章主要知识点是关于Python、python教程的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子资料:

给学习python的读者整理一篇《python描述器的分类》优秀文章,技术点分析的很透彻,这里给大家转摘到这里,觉得好就请收藏下。

python描述器的分类

本文教程操作环境:windows7系统、Python 3.9.1,DELL G3电脑。

1、非数据描述器

非数据描述器,只对类属性产生作用。当访问类属性时,将调用描述器的__get__方法。当非数据描述器是实例的变量时,实例访问非数据描述器不会调用__get__方法,只是访问了描述器类的实例。

# 示例
class Student1:
    def __init__(self):
        self.course = 'Python'
        print('Student1.__init__')
 
class Student2:
    stu1 = Student1()     # Student1()返回的是Student1类的实例
 
    def __init__(self):
        print('Student2.__init__')
 
print(Student2.stu1.course)
 
# 创建Student2的实例对象
stu2 = Student2()
print(stu2.stu1.course)
 
 
# 示例:引入描述器
class Stduent1:
    def __init__(self):
        self.course = 'Python'
        print('Stduent1.__init__')
 
    def __get__(self, instance, owner):
        print('self={} instance={} owner={}'.format(self, instance, owner))
 
class Stduent2:
    stu1 = Stduent1()
    def __init__(self):
        print('Stduent2.__init__')
 
print(Stduent2.stu1.course)
# Stduent2.stu1会访问Stduent1的实例,默认会调用__get__方法,但是__get__方法没有将实例返回,因此,Stduent2.stu1.course会报错
 
stu2 = Stduent2()
print(stu2.stu1.course)  # 一样的报错
 
 
# 示例 引入描述器
class Stduent1:
    def __init__(self):
        self.course = 'Python'
        print('Stduent1.__init__')
 
    def __get__(self, instance, owner):
        # 这里的self为Stduent1的实例. instance为实例, 如果是类访问,那么instance为None. owner是调用者的类
        print('self={} instance={} owner={}'.format(self, instance, owner))
        return self # 返回Student1的实例self
 
class Stduent2:
    stu1 = Stduent1()
    def __init__(self):
        print('Stduent2.__init__')
 
print(Stduent2.stu1.course)
 
stu2 = Stduent2()
print(stu2.stu1.course)

2、数据描述器

数据描述器,针对类属性和实例属性都产生作用。当访问或者修改此属性时,将调用相应的__get__或者__set__方法。

# 示例1:
class Student1:
    def __init__(self):
        self.course = 'Python'
        print('Student1.__init__')
 
    def __get__(self, instance, owner):
        # 这里的self为Student1的实例. instance为实例, 如果是类访问,那么instance为None. owner是调用者的类
        print('self={} instance={} owner={}'.format(self, instance, owner))
        return self   # 返回Student1的实例self
 
class Student2:
    stu1 = Student1()
 
    def __init__(self):
        print('Student2.__init__')
        self.y = Student1()   # 没有调用__get__方法
 
print(Student2.stu1.course)
 
stu2 = Student2()
print(stu2.y)
 
 
# 示例,数据描述器
class Student1:
    def __init__(self):
        self.course = 'Python'
        print('Student1.__init__')
 
    def __get__(self, instance, owner):
        print('self={} instance={} owner={}'.format(self, instance, owner))
        return self
 
    def __set__(self, instance, value):
        print('self={} instance={} value={}'.format(self, instance, value))
        self.course = value
 
class Student2:
    stu1 = Student1()
 
    def __init__(self):
        print('Student2.__init__')
        self.y = Student1()   # 调用了__get__方法
 
print(Student2.stu1.course)
 
stu2 = Student2()
print(stu2.stu1)

以上就是python描述器的分类详解,看完本篇的文章后,相信大家已经能够对描述器的类型进行区分。非数据描述器只作用类属性这点,大家一定不要忘记了哦。

上一篇:Python中Kafka是什么

下一篇:python类装饰器如何使用?

相关内容

  • 如何解决Python中open()函数打开文件路径报错问题

    这篇文章主要介绍了Python学习笔记之open()函数打开文件路径报错问题,现在分享给大家,也给大家做个参考。一起过来看看吧

    01-20Python学习笔记之open()函数打开文件路径报错问题

    阅读更多
  • 详解python实现写数字文件名的递增保存文件方案

    今天小编就为大家分享一篇python实现写数字文件名的递增保存文件方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    02-29python实现写数字文件名的递增保存文件方法

    阅读更多
  • python利用Future对象回调别的函数知识点总结

    最近在学习python,所以这篇文章主要给大家介绍了关于在python中利用Future对象回调别的函数的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需

    11-06python中利用Future对象回调别的函数示例代码

    阅读更多
  • Python登录状态进行接口测试 Python 保持登录状态进行接口测试的方法示例

    记录三种添加cookie保持接口登录状态的方法,方便自己回顾。 1.简单粗暴式。 此方法比较小白,前提是已经通过fiddler抓包等方式拿到了cookie,然后直接塞进去。 import requests trainsUrl =http://XXX

    08-06Python登录状态进行接口测试

    阅读更多
  • Python正确读取资源文件

    这篇文章主要介绍了基于Python正确读取资源文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    04-13Python读取文件

    阅读更多
  • 自学Python编程基础学习笔记

    自学Python编程基础学习笔记

    这是一本面向Python初学者的实用学习笔记,适合刚接触Python的初学者以及希望使用Python处理和分析数据的读者阅读,也可最为工具参考资料

    大小:16.1 MBPython手册

    立即下载
  • OpenCV 3计算机视觉:Python语言实现

    OpenCV 3计算机视觉:Python语言实现

    OpenCV 3 是一种先进的计算机视觉库,可以用于各种图像和视频处理操作,通过OpenCV 3 能很容易地实现一些有前景且功能先进的应用(比如:人脸识别或目标跟踪等)。理解与计算机视觉相关的

    大小:52 MBOpenCV

    立即下载
  • 用Python写网络爬虫

    用Python写网络爬虫

    做为这种方便快捷地搜集在网上信息内容并从这当中提取出能用信息内容的方法,网络爬虫技术性变得更加有效。应用Python那样的简易计算机语言,你能应用小量程序编写专业技能就能够抓取

    大小:9.9 MBPython爬虫

    立即下载

学习笔记

30小时37分钟前回答

python实现在遍历列表时,直接对dict元素增加字段的方法

example: for item in warehouse_list: warehouse_id = item['warehouse_id'] warehouse = Warehouse.objects.get(id=warehouse_id) item['warehouse_owner_id'] = warehouse.owner_id item['warehouse_name'] = warehouse.warehouse_name 这个功能实在太强大了,python好棒。 以上这篇python实现在遍历列表时,直接对dict元素增加字段的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持码农之家。 ……

47小时34分钟前回答

python 实现波浪滤镜特效

本文用 Python 实现 PS 滤镜的波浪特效 import numpy as npfrom skimage import img_as_floatimport matplotlib.pyplot as pltfrom skimage import ioimport numpy.matlibimport math# 图片位置file_name2='D:/Visual Effects/PS Algorithm/4.jpg'img=io.imread(file_name2)img = img_as_float(img)row, col, channel = img.shapeimg_out = img * 1.0alpha = 70.0beta = 30.0degree = 20.0center_x = (col-1)/2.0center_y = (row-1)/2.0xx = np.arange(col)yy = np.arange(row)x_mask = numpy.matlib.repmat (xx, row, 1)y_mask = numpy.matlib.repmat (yy, col, 1)y_mask = np.transpose(y_mask)xx_dif = x_mask - center_xyy_dif = center_y - y_maskx = degree * np.sin(2 * math.pi * yy_dif / alpha) + xx_dify = degree * np.cos(2 * math.pi * xx_dif / beta) + yy_difx_new = x + center_xy_new = center_y - y int_x = np.floor (x_ne……