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.Integral):
10             raise ValueError("int value need")
11         if value < 0:
12             raise ValueError("positive value need")
13         self.value = value
14     def __delete__(self, instance):
15         pass
16
17 class NonDataIntField:
18     """
19     非数据属性描述符
20     """
21     def __get__(self, instance, owner):
22         return self.value
23
24 class User:
25     age = IntField()
26
27 if __name__ == "__main__":
28     u = User()
29     u.age

如果 user 是某个类的实例,那么user.age(以及等价的 getattr(user, ‘age‘) )

首先调用 __getattribute__。如果类定义了 __getattr__ 方法,那么在 __getattribute__ 抛出 AttributeError 的时候就会调用到 __getattr__,

而对于描述符 (__get__) 的调用,则是发生在 __getattribute__ 内部的。

user = User(), 那么 user.age 顺序如下:

1、如果"age"是出现在 User 类或其基类的 __dict__ 中,且 age 是 data descriptor (数据属性描述符), 那么调用其 __get__ 方法

2、如果 "age" 出现在实例 user 的 __dict__ 中,那么直接返回  obj.__dict__[‘age‘],

3‘、如果 "age" 出现在 User 类或其基类的 __dict__ 中

3.1、如果 "age" 是 non-data descriptor (), 那么调 用其 __get__ 方法

3.2、返回 __dict__[‘age‘]

4、如果 User 有 __getattr__ 方法, 调用 __getattr__ 方法,

5、抛出 AttributeError 

原文地址:https://www.cnblogs.com/sqtu/p/10301322.html

时间: 2024-10-07 01:28:52

python 属性描述符及属性查找顺序的相关文章

python之属性描述符与属性查找规则

描述符 import numbers class IntgerField: def __get__(self, isinstance, owner): print('获取age') return self.num def __set__(self, instance, value): print('设置age值时') if not isinstance(value, numbers.Integral): raise ValueError('int need') self.num = value

python高级编程之最佳实践,描述符与属性01

# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #最佳实践 """ 为了避免前面所有的问题,必须考虑到几下几点: ~1:应该避免多重继承,可以一些设计模式来代替它 ~2:super使用必须一致,在类层次结构中,应该在所有地方都使用super或者彻底不使用它,滥用super和传统调用是一种滥用方法,建议使用super ~3:不要滥用经典类和新式类,两者都具备代码库将导致不同的mro表现 ~4:调

JS面向对象篇一、理解对象及属性特性(属性描述符)

本文内容 1.理解对象; 2.ECMAScript有两种属性类型:数据属性和访问器属性(getter和setter函数); 3.数据属性的属性特性:[[Configurable]].[[Enumerable]].[[Writable]].[[value]]; 4.访问器属性的属性特性:[[Configurable]].[[Enumerable]].[[get]].[[set]]; 5.Object.defineProperty().Object.defineProperties().Object

Java重要技术(13)内省之属性描述符PropertyDescriptor

1.1. 属性描述符(PropertyDescriptor) 可以使用PropertyDescrptor类来访问Java Bean的属性和方法. Object obj; Class beanClass = SampleBean.class; Object value; PropertyDescriptor propertyDescriptor; try { //创建对象 obj = SampleBean.class.newInstance(); //访问age属性. propertyDescri

深入理解javascript对象系列第三篇——神秘的属性描述符

× 目录 [1]类型 [2]方法 [3]详述[4]状态 前面的话 对于操作系统中的文件,我们可以驾轻就熟将其设置为只读.隐藏.系统文件或普通文件.于对象来说,属性描述符提供类似的功能,用来描述对象的值.是否可配置.是否可修改以及是否可枚举.本文就来介绍对象中神秘的属性描述符 描述符类型 对象属性描述符的类型分为两种: 数据属性和访问器属性 数据属性 数据属性(data property)包含一个数据值的位置,在这个位置可以读取和写入值.数据属性有4个特性 [1]Configurable(可配置性

JS属性描述符

var myObject = { a:2 }; Object.getOwnpropertyDescriptor(myObject,"a"); { value:2, writable:true, emumerable:true, configurable:true } 这段代码中的属性描述符不仅只有2,还有writable(可写).enumerable(可枚举).configurable(可配置)三种 在创建普通属性时属性描述符会使用默认值,我们也可以使用 Object.definePr

理解JavaScript中的属性描述符

我们把描述JavaScript中定义内部特性的属性叫做属性描述符 分为两大类:数据描述符和存取描述符 数据描述符是一个拥有可写或不可写的属性(Writable); 存取描述符不包含数据值,是一组拥有getter和setter属性的描述符: 描述符必须是这两者之一,不可能都是这两者: 数据描述符合存取描述符都具有以下的可选键值: configurable这个指的是描述,当属性的configurable的值为true的时候,该属性的描述符才可以改变,同时该属性可以从对象上被删除,默认值是false

寻找实体上SaleOrgId对应的属性描述符失败,实体不存在此属性!

表达式计算出错: FSaleOrgId.FNumber == '105' ( 寻找实体上SaleOrgId对应的属性描述符失败,实体不存在此属性![EntityType:SaleOrderFinance Propeyties:Id LocalCurrId_Id LocalCurrId ExchangeTypeId_Id ExchangeTypeId ExchangeRate PayAdvanceRate PayAdvanceAmount DiscountListId_Id DiscountLis

python tips:描述符descriptor

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