python __setattr__、__getattr__、__getattribute__全面详解
一、属性引用函数
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__全面详解的更多相关文章
- 【Python】Python内置函数dir详解
1.命令介绍 最近学习并使用了一个python的内置函数dir,首先help一下: 复制代码代码如下: >>> help(dir)Help on built-in function ...
- python __setattr__, __getattr__, __delattr__, __call__
python __setattr__, __getattr__, __delattr__, __call__ getattr `getattr`函数属于内建函数,可以通过函数名称获取 value = ...
- Python安装、配置图文详解(转载)
Python安装.配置图文详解 目录: 一. Python简介 二. 安装python 1. 在windows下安装 2. 在Linux下安装 三. 在windows下配置python集成开发环境(I ...
- 【和我一起学python吧】Python安装、配置图文详解
Python安装.配置图文详解 目录: 一. Python简介 二. 安装python 1. 在windows下安装 2. 在Linux下安装 三. 在windows下配置python集成开发环境( ...
- Python中的高级数据结构详解
这篇文章主要介绍了Python中的高级数据结构详解,本文讲解了Collection.Array.Heapq.Bisect.Weakref.Copy以及Pprint这些数据结构的用法,需要的朋友可以参考 ...
- [转]使用python来操作redis用法详解
转自:使用python来操作redis用法详解 class CommRedisBase(): def __init__(self): REDIS_CONF = {} connection_pool = ...
- Python中格式化format()方法详解
Python中格式化format()方法详解 Python中格式化输出字符串使用format()函数, 字符串即类, 可以使用方法; Python是完全面向对象的语言, 任何东西都是对象; 字符串的参 ...
- python设计模式之装饰器详解(三)
python的装饰器使用是python语言一个非常重要的部分,装饰器是程序设计模式中装饰模式的具体化,python提供了特殊的语法糖可以非常方便的实现装饰模式. 系列文章 python设计模式之单例模 ...
- Python调用windows下DLL详解
Python调用windows下DLL详解 - ctypes库的使用 2014年09月05日 16:05:44 阅读数:6942 在python中某些时候需要C做效率上的补充,在实际应用中,需要做部分 ...
- Python操作redis字符串(String)详解 (三)
# -*- coding: utf-8 -*- import redis #这个redis不能用,请根据自己的需要修改 r =redis.Redis(host=") 1.SET 命令用于设置 ...
随机推荐
- SharePoint 读取内容的插件之SharepointPlus
前言 最近,一直在前端和SharePoint进行交互,然后,发现一个好用的插件,分享给大家. 首先,需要添加一个引用,如下图: 当然,我这里只是举个例子,亲们一定要去下载这个库,然后传到服务器或者文档 ...
- ceph:如何处理rados --striper上传失败的对象
如何处理使用rados --striper上传失败的对象? `Remove striped objects from a ceph pool without using the striper lib ...
- jquery监测文本框变化
$("#mobile").on('keyup paste blur', function () { var mobile = $(this).val(); ...
- java对对象或者map的属性进行排序
package com.xkj.spider.mpb.util; import java.lang.reflect.Method; import java.util.HashMap; import j ...
- MongoDB下Map-Reduce使用简单翻译及示例
目录 Map-Reduce JavaScript 函数 Map-Reduce 行为 一个简单的测试 原文地址https://docs.mongodb.com/manual/core/map-reduc ...
- 机智的MySQL优化器 --- is null
[介绍] 工作的越久越到的的问题越多,就越是觉得一些“老话”历久弥新:由于最近的学习计划是深入的学习一遍MySQL优化器:学习过程中的一些成果 也会发布到这里,一来是为了整理自己已经知道的和新学到的, ...
- Python(字符编码)
https://www.cnblogs.com/zihe/p/6993891.html 一 了解字符编码的知识储备 1. 文本编辑器存取文件的原理(nodepad++,pycharm,word) 打开 ...
- RapidJson 的使用
rapidjson为了最大化性能,大量使用了浅拷贝,使用之前一定要了解清楚.如果采用了浅拷贝,特别要注意局部对象的使用,以防止对象已被析构了,却还在被使用. rapidjson使用注意点: 1.对不存 ...
- iOS开发之duplicate symbols for architecture x86_64错误
[主要内容:] 1. 错误提示 2. 分析错误原因 3. 解决问题办法 一.错误提示 在我们写代码过程中可能会经常遇到这样一个错误: <span style="font-size: ...
- CentOS 7下PXE+Kickstart无人值守安装操作系统
1.简介 1.1. 什么是PXE PXE(Pre-boot Execution Environment,预启动执行环境)是由Intel公司开发的最新技术,工作于Client/Server的网络模式,支 ...