一、属性引用函数

hasattr(obj,name[,default])
getattr(obj,name)
setattr(obj,name,value)
delattr(obj,name)

二、属性引用重载

def __setattr__(self,key,value): 
  1.拦截所有属性的赋值语句。
  2.self.attr=value 相当于 self.__setattr__("attr",value)。
  3.如果在__setattr__中对任何self属性赋值,都会再调用__setattr__,导致无穷递归循环。只能self.__dict__["attr"]=value 。

def __getattribute__(self, key): 
  1.拦截所有的属性获取,包括未定义的属性,self.__dict__,等点号运算。
  2.所有的属性先在__getattribute__中没有找到,就会抛出AttributeError,__getattr__接收这个错误,此时进入__getattr__中继续寻找。
  3.如果__getattribute__没有抛出AttributeError,将不会调用__getattr__。

def __getattr__(self, key): 
  拦截self.attr运算。当在__dict__中未找到该属性时,在类属性中也没有找到该属性,并且在继承树中也没有找到该属性,就会调用这个方法。

def __delattr__(self,key): 删除属性

三、示例

class Square:  # 正方形

    def __init__(self, l):
self.length = l # 边长 def __getattr__(self, key):
if key == "area":
return "__getattr__被调用了,为了area" sq = Square(10)
print(sq.length) #
print(sq.area) # __getattr__被调用了,为了area
class Square:  # 正方形

    def __init__(self, l):
pass def __getattr__(self, key):
print("__getattr__被调用了")
if key == "length":
return 1111 def __getattribute__(self, key123):
print("__getattribute__被调用了")
# return 123456
raise AttributeError sq = Square(10)
print(sq.length)
# __getattribute__被调用了
# __getattr__被调用了
#
class Square:  # 正方形

    def __init__(self,l):
pass def __getattr__(self, key):
print("__getattr__被调用了")
raise AttributeError("") def __getattribute__(self, key123):
print("__getattribute__被调用了")
return 123456
# raise AttributeError sq = Square(10)
print(sq.length)
# __getattribute__被调用了
#
class Square:  # 正方形

    def __init__(self, l):
self.length = l # 边长 def __setattr__(self, key, value):
print("调用__setattr__", "key=", key)
if key == "perimeter":
self.__dict__["length"] = value / 4
self.__dict__["perimeter"] = value
if key == "length":
self.__dict__["length"] = value
self.__dict__["perimeter"] = value * 4 def __getattr__(self, key):
print("调用__getattr__ ,", "key =", key)
if key == "area":
return 960 def __getattribute__(self, key123):
print("调用__getattribute__ ,", "key123 =", key123)
return object.__getattribute__(self, key123) sq = Square(10)
# 调用__setattr__
# 调用__getattribute__ , key123 = __dict__ 此时执行self.__dict__["length"] = value
# 调用__getattribute__ , key123 = __dict__ 此时执行self.__dict__["perimeter"] = value * 4 print(sq.length)
# 调用__getattribute__ , key123 = length 此时执行self.length = l # 边长 print(sq.perimeter)
# 调用__getattribute__ , key123 = perimeter
# print(sq.area)
# 调用__getattribute__ , key123 = area
# 调用__getattr__ , key = area
#

python __setattr__、__getattr__、__getattribute__全面详解的更多相关文章

  1. 【Python】Python内置函数dir详解

    1.命令介绍 最近学习并使用了一个python的内置函数dir,首先help一下: 复制代码代码如下: >>> help(dir)Help on built-in function ...

  2. python __setattr__, __getattr__, __delattr__, __call__

    python __setattr__, __getattr__, __delattr__, __call__ getattr `getattr`函数属于内建函数,可以通过函数名称获取 value = ...

  3. Python安装、配置图文详解(转载)

    Python安装.配置图文详解 目录: 一. Python简介 二. 安装python 1. 在windows下安装 2. 在Linux下安装 三. 在windows下配置python集成开发环境(I ...

  4. 【和我一起学python吧】Python安装、配置图文详解

     Python安装.配置图文详解 目录: 一. Python简介 二. 安装python 1. 在windows下安装 2. 在Linux下安装 三. 在windows下配置python集成开发环境( ...

  5. Python中的高级数据结构详解

    这篇文章主要介绍了Python中的高级数据结构详解,本文讲解了Collection.Array.Heapq.Bisect.Weakref.Copy以及Pprint这些数据结构的用法,需要的朋友可以参考 ...

  6. [转]使用python来操作redis用法详解

    转自:使用python来操作redis用法详解 class CommRedisBase(): def __init__(self): REDIS_CONF = {} connection_pool = ...

  7. Python中格式化format()方法详解

    Python中格式化format()方法详解 Python中格式化输出字符串使用format()函数, 字符串即类, 可以使用方法; Python是完全面向对象的语言, 任何东西都是对象; 字符串的参 ...

  8. python设计模式之装饰器详解(三)

    python的装饰器使用是python语言一个非常重要的部分,装饰器是程序设计模式中装饰模式的具体化,python提供了特殊的语法糖可以非常方便的实现装饰模式. 系列文章 python设计模式之单例模 ...

  9. Python调用windows下DLL详解

    Python调用windows下DLL详解 - ctypes库的使用 2014年09月05日 16:05:44 阅读数:6942 在python中某些时候需要C做效率上的补充,在实际应用中,需要做部分 ...

  10. Python操作redis字符串(String)详解 (三)

    # -*- coding: utf-8 -*- import redis #这个redis不能用,请根据自己的需要修改 r =redis.Redis(host=") 1.SET 命令用于设置 ...

随机推荐

  1. Asp.NET WebApi+Redis实现单用户登录实战演练

    一.课程介绍 本次分享课程属于<C#高级编程实战技能开发宝典课程系列>中的一部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集.整理和 ...

  2. jquery 多级联动下拉列表含(数据模型)

    方法 /** * 级联 * 联动 * @param url:访问json数据的地址 * @param param:参数 * @param levelIds:页面下拉标签数组,为联动级数 * @priv ...

  3. MongoDB地理空间数据存储及检索

    目录 1.存入地理数据 GeoJSON数据存入 1.Ponit 点数据 2.LineString 线数据(多段线) 3. Polygon 多边形数据 4.MultiPoint多点.MultiLineS ...

  4. webstorm快捷键 webstorm keymap内置快捷键英文翻译、中英对照说明

    20160114参考网络上的快捷键,整理自己常用的: 查找/代替shift+shift 快速搜索所有文件,简便ctrl+shift+N 通过文件名快速查找工程内的文件(必记)ctrl+shift+al ...

  5. pandas.Dataframe复杂条件过滤

    https://stackoverflow.com/questions/11418192/pandas-complex-filter-on-rows-of-dataframe mask = df.ap ...

  6. BizTalk RosettaNet解决方案搭建

    contoso为证书颁发机构 分别在两台服务器中配置hosts 192.168.199.160 fabrikam 192.168.199.225 contoso 安装CA 控制面板,添加删除程序 打开 ...

  7. golang协程池设计

    Why Pool go自从出生就身带“高并发”的标签,其并发编程就是由groutine实现的,因其消耗资源低,性能高效,开发成本低的特性而被广泛应用到各种场景,例如服务端开发中使用的HTTP服务,在g ...

  8. 移植 iperf 网络性能测试工具到 Android-P

    . . . . . 新开发板使用了 Android-P 的方案,WiFi 刚刚调通,为了测试 WiFi 稳定性,需要使用 iperf 工具.但 Android 并没有提供这个工具,只能自己移植一份了. ...

  9. Android Studio报错Error:Failed to open zip file. Gradle's dependency cache may be corrupt

    Android Studio导入项目后,Gradle编译失败,报错如下. Error:Failed to open zip file. Gradle's dependency cache may be ...

  10. URLSearchParams和axios的post请求(防忘记)

    import axios from 'axios' Vue.prototype.axios = axios mounted () { let params = new URLSearchParams( ...