iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python中的descriptor描述器简明使用指南
  • 368
分享到

Python中的descriptor描述器简明使用指南

简明使用指南Python 2022-06-04 19:06:18 368人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

当定义迭代器的时候,描述是实现迭代协议的对象,即实现__iter__方法的对象。同理,所谓描述器,即实现了描述符协议,即__get__, __set__, 和 __delete__方法的对象。 单看定义,还

当定义迭代器的时候,描述是实现迭代协议的对象,即实现__iter__方法的对象。同理,所谓描述器,即实现了描述符协议,即__get__, __set__, 和 __delete__方法的对象。

单看定义,还是比较抽象的。talk is cheap。看代码吧:


class WEBFramework(object):
  def __init__(self, name='flask'):
    self.name = name

  def __get__(self, instance, owner):
    return self.name

  def __set__(self, instance, value):
    self.name = value


class pythonSite(object):

  webframework = WebFramework()

In [1]: PythonSite.webframework
Out[1]: 'Flask'

In [2]: PythonSite.webframework = 'Tornado'

In [3]: PythonSite.webframework
Out[3]: 'Tornado'

定义了一个类WebFramework,它实现了描述符协议__get__和__set__,该对象(类也是对象,一切都是对象)即成为了一个描述器。同时实现__get__和__set__的称之为资料描述器(data descriptor)。仅仅实现__get__的则为非描述器。两者的差别是相对于实例的字典的优先级。

如果实例字典中有与描述器同名的属性,如果描述器是资料描述器,优先使用资料描述器,如果是非资料描述器,优先使用字典中的属性。

描述器的调用
对于这类魔法,其调用方法往往不是直接使用的。例如装饰器需要用 @ 符号调用。迭代器通常在迭代过程,或者使用 next 方法调用。描述器则比较简单,对象属性的时候会调用。


In [15]: webframework = WebFramework()

In [16]: webframework.__get__(webframework, WebFramework)
Out[16]: 'Flask'

描述器的应用
描述器的作用主要在方法和属性的定义上。既然我们可以重新描述类的属性,那么这个魔法就可以改变类的一些行为。最简单的应用则是可以配合装饰器,写一个类属性的缓存。Flask的作者写了一个werkzeug网络工具库,里面就使用描述器的特性,实现了一个缓存器。


class _Missing(object):
  def __repr__(self):
    return 'no value'

  def __reduce__(self):
    return '_missing'


_missing = _Missing()


class cached_property(object):
  def __init__(self, func, name=None, doc=None):
    self.__name__ = name or func.__name__
    self.__module__ = func.__module__
    self.__doc__ = doc or func.__doc__
    self.func = func

  def __get__(self, obj, type=None):
    if obj is None:
      return self
    value = obj.__dict__.get(self.__name__, _missing)
    if value is _missing:
      value = self.func(obj)
      obj.__dict__[self.__name__] = value
    return value


class Foo(object):
  @cached_property
  def foo(self):
    print 'first calculate'
    result = 'this is result'
    return result


f = Foo()

print f.foo  # first calculate this is result
print f.foo  # this is result

运行结果可见,first calculate只在第一次调用时候被计算之后就把结果缓存起来了。这样的好处是在网络编程中,对Http协议的解析,通常会把HTTP的header解析成python的一个字典,而在视图函数的时候,可能不知一次的访问这个header,因此把这个header使用描述器缓存起来,可以减少多余的解析。

描述器在python的应用十分广泛,通常是配合装饰器一起使用。强大的魔法来自强大的责任。描述器还可以用来实现ORM中对sql语句的"预编译"。恰当的使用描述器,可以让自己的Python代码更优雅。

--结束END--

本文标题: Python中的descriptor描述器简明使用指南

本文链接: https://www.lsjlt.com/news/14834.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python中的描述器怎么使用
    这篇文章主要介绍“Python中的描述器怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python中的描述器怎么使用”文章能帮助大家解决问题。概述Python描述器是一个Python对象,它...
    99+
    2023-07-05
  • 使用numpy函数的简明指南
    简单易懂的NumPy函数使用方法,需要具体代码示例 NumPy是Python中非常常用的科学计算库,它提供了丰富的函数和工具来处理数组和矩阵。在本文中,我们将介绍一些NumPy中常用的函数以及它们的使用方法,并通过具体的代码示例...
    99+
    2024-01-26
  • PropertyDescriptor属性描述器简单使用
    属性描述器是Python中一种用于控制属性访问的机制,可以通过定义__get__、__set__、__delete__方法来控制属性...
    99+
    2023-09-12
    使用
  • Python描述符的使用
      前言 作为一位python的使用者,你可能使用python有一段时间了,但是对于python中的描述符却未必使用过,接下来是对描述符使用的介绍 场景介绍 为了引入描述符的使用,我们先设计一个非常简单的类: class Produ...
    99+
    2023-01-30
    Python
  • python描述器的用法
    这篇文章主要介绍python描述器的用法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!python有哪些常用库python常用的库:1.requesuts;2.scrapy;3.pillow;4.twisted;5....
    99+
    2023-06-14
  • 使用pipenv创建虚拟环境的简明指南
    简单易懂的指南:使用pipenv构建虚拟环境 引言:在Python开发中,我们经常需要使用虚拟环境来隔离项目的依赖库,以确保不同项目之间的依赖关系不会相互干扰。pipenv是一个强大且用户友好的工具,可以帮助我们方便地创建和管理...
    99+
    2024-01-16
    虚拟环境 构建 pipenv
  • 怎么在Python描述器中调用__getattribute__
    今天就跟大家聊聊有关怎么在Python描述器中调用__getattribute__,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。python有哪些常用库python常用的库:1.re...
    99+
    2023-06-14
  • python类中成员描述符的使用方法
    这篇文章将为大家详细讲解有关python类中成员描述符的使用方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。python主要应用领域有哪些1、云计算,典型应用OpenStack。2、WEB前端开发,众多...
    99+
    2023-06-14
  • 怎么使用Python描述器实现ORM模型
    本文小编为大家详细介绍“怎么使用Python描述器实现ORM模型”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么使用Python描述器实现ORM模型”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。访问或者修改描...
    99+
    2023-06-29
  • 使用pip升级Python版本的简易指南
    一步步教你使用pip升级Python版本,需要具体代码示例 导语:Python是一种功能强大的编程语言,常用于开发应用程序和网站。随着Python不断的发展和更新,升级Python版本变得非常重要。本文将教你如何使用pip升级P...
    99+
    2024-02-02
    python版本 pip升级 一步步教你使用
  • Python虚拟机中描述器的王炸应用分享
    目录property什么是 property如何使用 propertyproperty 的本质在 python 语言层面实现 property 机制classmethod 和 sta...
    99+
    2023-05-19
    Python虚拟机描述器应用 Python虚拟机 Python 描述器
  • Python初学者必看:简明易懂的pip安装指南
    Python新手必备:简单易懂的pip安装教程 引言:在Python编程中,安装外部库是非常重要的一步。而pip作为Python官方推荐的包管理工具,简单易懂且功能强大,成为Python新手必备技能之一。本文将为大家介绍pip的...
    99+
    2024-01-16
    Python pip 安装教程
  • python中描述器的访问顺序是什么
    这篇文章给大家介绍python中描述器的访问顺序是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。python的数据类型有哪些python的数据类型:1. 数字类型,包括int(整型)、long(长整型)和float...
    99+
    2023-06-14
  • Python使用描述器实现ORM模型的方法详解
    目录1.__set__方法:设置属性 2.__get__方法:访问属性3.__delete__方法:删除属性 4.描述器实现ORM模型: 总结访问或者修...
    99+
    2024-04-02
  • C++简明图解this指针的使用
    目录成员数据和成员函数的存储方式this指针的引入this指针概述this指针的使用c++的封装性:将数据 和 方法 封装在一起 数据 和 方法 是分开存储。 每个对象 拥有独立的数...
    99+
    2024-04-02
  • 深入解析Golang中Map数据结构的简明指南
    Golang中的Map是一种非常常用的数据结构,它可以将一个键(key)和一个值(value)关联在一起。Map在很多场合都非常有用,比如统计某个单词在一篇文章中出现的次数、保存学生的考试成绩等等。 本文将深...
    99+
    2024-01-16
    Golang map 详解
  • 使用Python的命令行参数:一个简易指南
    Python命令行参数的使用指南 【引言】在开发和使用Python程序的过程中,经常需要从命令行中获取用户输入的参数。Python提供了丰富的库和方法来处理命令行参数,本文将介绍一些常用的方法和技巧,帮助开发者更好地使用命令行参...
    99+
    2024-02-03
    使用指南 参数使用方法 python程序 标准库
  • C语言简明介绍指针的使用
    目录1. 指针类型2. 野指针3. 指针的运算3.1 指针+-整数3.2指针-指针3.3 指针的关系运算4. 指针数组1. 指针类型 指针以字节为单位; 指针类型决定了解引用时能访问...
    99+
    2024-04-02
  • 使用Plist编辑器—简单入门指南
    Plist编辑器是一种用于编辑和管理Plist文件的工具。Plist是一种属性列表文件,常用于储存应用程序的配置信息和数据。下面是使...
    99+
    2023-09-20
    Plist
  • 使用阿里云的PHP服务器简单指南
    阿里云的PHP服务器是一种高性能的服务器解决方案,特别适用于需要处理大量PHP应用程序的开发者。本篇文章将详细指导如何使用阿里云的PHP服务器。 一、准备首先,你需要创建一个阿里云的账号,并获取你的访问密钥。如果你还没有阿里云账号,你可以...
    99+
    2023-12-11
    阿里 简单 服务器
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作