python Descriptor (描述符)

简介:

python 描述符是新式类(继承自object)中的语言协议,基于描述符可以提供更佳优雅的解决方案。

python的classmethod, staticmethod, property都是基于描述符建立的。

描述符的协议:

定义了__set__, __get__, __delete__3个方法中任何一个方法的object可以作为描述符.

描述符分类:

同时定义了__set__,__get__被叫做data descriptor.

只定义了__get__被叫做no-data descriptor.

2种描述符的区别:

Data and non-data descriptors differ in how overrides are calculated with respect to entries in an instance’s dictionary. If an instance’s dictionary has an entry with the same name as a data descriptor, the data descriptor takes precedence. If an instance’s dictionary has an entry with the same name as a non-data descriptor, the dictionary entry takes precedence.

在 attrubuite lookup过程中 :

如果对象属性有与data-descriptor同名的属性,data-descriptor优先于对象属性.

如果对象属性有与no-data descriptor同名的属性,对象属性优先。

触发描述符的调用:

A descriptor can be called directly by its method name. For example, d.__get__(obj).

Alternatively, it is more common for a descriptor to be invoked automatically upon attribute access. For example, obj.d looks up d in the dictionary of obj. If d defines the method __get__(), thend.__get__(obj) is invoked according to the precedence rules listed below.

The details of invocation depend on whether obj is an object or a class. Either way, descriptors only work for new style objects and classes. A class is new style if it is a subclass of object.

For objects, the machinery is in object.__getattribute__() which transforms b.x into type(b).__dict__[‘x‘].__get__(b, type(b)). The implementation works through a precedence chain that gives data descriptors priority over instance variables, instance variables priority over non-data descriptors, and assigns lowest priority to __getattr__() if provided

The important points to remember are:

时间: 2024-10-14 21:50:30

python Descriptor (描述符)的相关文章

python tips:描述符descriptor

描述符(descriptor)是实现了__get__.__set__.__del__方法的类,进一步可以细分为两类: 数据描述符:实现了__get__和__set__ 非数据描述符:没有实现__set__ 描述符在类的属性调用中起着很重要的作用,类在调用属性时,遵守两个规则: 按照实例属性.类属性的顺序选择属性,即实例属性优先于类属性 如果在类属性中发现同名的数据描述符,那么该描述符会优先于实例属性 非数据描述符会被实例属性覆盖 class A: def __get__(self, obj, c

Python属性描述符(二)

Python存取属性的方式特别不对等,通过实例读取属性时,通常返回的是实例中定义的属性,但如果实例未曾定义过该属性,就会获取类属性,而为实例的属性赋值时,通常会在实例中创建属性,而不会影响到类本身.这种不对等的方式对描述符类也有影响. def cls_name(obj_or_cls): # 传入一个实例,返回类名 cls = type(obj_or_cls) if cls is type: cls = obj_or_cls return cls.__name__.split('.')[-1] d

python之描述符

描述符是将某种特殊类型的类实例指派给另一个类的属性,某种特殊类型的类就是这个类里面封装了get,set,delete这三个方法,可以将这个类指派给另一个类的某一个属性,这样就可以通过这三个方法对该属性进行操作,举例如下 1 class MyDecriptor: 2 def __set__(self,instance,value): 3 print('set') 4 def __get__(self,instance,owner): 5 print('get') 6 def __delete__(

Python属性描述符(一)

描述符是对多个属性运用相同存取逻辑的一种方式,,是实现了特性协议的类,这个协议包括了__get__.__set__和__delete__方法.property类实现了完整的描述符协议.通常,可以只实现部分协议,如只实现了__get__或__set__,而不必把__get__.__set__和__delete__全部实现 现在,让我们用描述符协议升级上一个章节Python动态属性和特性(二)的LineItem类 图1-1 我们将定义一个Quantity类,LineItem类会用到两个Quantit

python 属性描述符及属性查找顺序

1 import numbers 2 class IntField: # 当一个类实现了 __get__, __set__, __delete__ 3 """ 4 数据描述符 5 """ 6 def __get__(self, instance, owner): 7 return self.value 8 def __set__(self, instance, value): 9 if not isinstance(value, numbers.

[TimLinux] Python 自定义描述符

1. 含义 在类中,含有属性(该属性需要存在类对象到__dict__属性中,不能为存在示例对象的__dict__属性中),对属性对操作(访问,设置值,删除)可以自定义行为,这样对自定义行为成为自定义属性描述符(Descriptor),这样的属性对象来自相应对类,这样的类称为描述符类. 2. 结构 class A(object): pass # 实现任一一个或多个:__get__, __set__, __delete__, __set_name__ # 类A称为描述符类 class T(objec

Python进阶-----描述符(__get__(),__set__(),__delete__())

一.描述符是什么 描述符本质就是一个新式类,在这个新式类中,至少实现了__get__(),__set__(),__delete__()中的一个,这也被称为描述符协议 __get__():调用一个属性时,触发 __set__():为一个属性赋值时,触发 __delete__():采用del删除属性时,触发 1 class Foo: #在python3中Foo是新式类,它实现了三种方法,这个类就被称作一个描述符 2 def __get__(self, instance, owner): 3 prin

python之描述符的应用

class Foo: def __init__(self,key,hope_type): self.key=key self.hope_type=hope_type def __get__(self, instance, owner): print('输出get') return instance.__dict__[self.key] def __delete__(self, instance): print('输出delete') instance.__dict__.pop(self.key)

转载python描述符介绍

来源:http://www.ibm.com/developerworks/cn/opensource/os-pythondescriptors/ 简介 Python 2.2 引进了 Python 描述符,同时还引进了一些新的样式类,但是它们并没有得到广泛使用.Python 描述符是一种创建托管属性的方法.除了其他优点外,托管属性还用于保护属性不受修改,或自动更新某个依赖属性的值. 描述符增加了对 Python 的理解,改善了编码技能.本文介绍了描述符协议,并演示了如何创建和使用描述符. 描述符协