python __setattr__、__getattr__、__getattribute__全面详解-程序员宅基地

技术标签: python  

一、属性引用函数

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)  # 10
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__被调用了
# 1111

 

class Square:  # 正方形

    def __init__(self,l):
        pass

    def __getattr__(self, key):
        print("__getattr__被调用了")
        raise AttributeError("1111111")

    def __getattribute__(self, key123):
        print("__getattribute__被调用了")
        return 123456
        # raise AttributeError


sq = Square(10)
print(sq.length)
# __getattribute__被调用了
# 123456

 

 

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
# 40

print(sq.area)
# 调用__getattribute__ , key123 = area
# 调用__getattr__ , key = area
# 960

 

转载于:https://www.cnblogs.com/wwxbi/p/7751778.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_33854644/article/details/94612453

智能推荐

java list(属性方法)_java list exists-程序员宅基地

文章浏览阅读1.2w次,点赞5次,收藏17次。List的方法和属性 方法或属性 作用Capacity 用于获取或设置List可容纳元素的数量。当数量超过容量时,这个值会自动增长。您可以设置这个值以减少容量,也可以调用trin()方法来减少容量以适合实际的元素数目。Count 属性,用于获取数组中当前元素数量Item( ) 通过指定索引获取或设置元素。对于List类来说,它是一个索引器。Add( ) 在List中添加一个对象的公有方法AddRan_java list exists

Golang单元测试和压力测试-程序员宅基地

文章浏览阅读1k次,点赞22次,收藏23次。go语言中的测试依赖go test命令。编写测试代码和编写普通的Go代码过程类似,并不需要学习新的语法,规则和工具。go test命令是一个按照一定约定和组织的测试代码的驱动程序。在包目录内,所有以_test.go为后缀名的源代码文件都是go test测试的一部分,不会被go build编译到最终可执行文件中。在*_test.go文件中有三种类型的函数,单元测试函数,基准测试函数和示例函数。

Python 的 Numpy 数值计算_numpy 数组中的值 分组计数-程序员宅基地

文章浏览阅读1k次,点赞4次,收藏5次。文章目录1. Numpy 介绍2. Numpy 数组2.1 介绍2.2 数组属性2.3 创建数组1. Numpy 介绍  Numpy(Numerical Python),是 Python 科学计算的基础包。Mumpy 主要提供了以下内容:快速高效的多维数组对象 ndarray。对数组执行元素级计算以及直接对数组执行科学计算的函数。线性代数、傅里叶变换及随机数生成的功能。将 C、C++..._numpy 数组中的值 分组计数

读写锁 优先级 linux,详谈Linux操作系统的三种状态的读写锁-程序员宅基地

文章浏览阅读885次。读写锁是另一种实现线程间同步的方式。与互斥量类似,但读写锁将操作分为读、写两种方式,可以多个线程同时占用读模式的读写锁,这样使得读写锁具有更高的并行性。读写锁的特性为:写独占,读共享;写锁优先级高。对于读写锁,掌握了这12个字就足矣了。Linux环境下,读写锁具有以下三种状态:读模式下加锁状态 (读锁)写模式下加锁状态 (写锁)不加锁状态虽然读写锁有读锁、写锁、不加锁三种状态,但其实它只有一把锁,..._读写锁 写优先

Java JSON 之 Map 转 JSON 字符串_java map 转字符串-程序员宅基地

文章浏览阅读1.2w次。http://www.verejava.com/?id=16998617072749下载依赖 jar 包 json.jar package com.json9;import java.util.HashMap;import java.util.Map;import org.json.JSONObject;public class Test{ public sta..._java map 转字符串

数据归一化(特征处理) 以及 各种归一化(BN-LN-GN-IN)的实现_数据中不同单位如何归一化-程序员宅基地

文章浏览阅读5.1k次,点赞3次,收藏15次。概述归一化:1. 把数据变成(0,1)或者(1,1)之间的小数。主要是为了数据处理方便提出来的,把数据映射到0~1范围之内处理,更加便捷快速。2. 把有量纲表达式变成无量纲表达式,便于不同单位或量级的指标能够进行比较和加权。归一化是一种简化计算的方式,即将有量纲的表达式,经过变换,化为无量纲的表达式,成为纯量。标准化:在机器学习中,我们可能要处理不同种类的资料,例如,音讯和图片上..._数据中不同单位如何归一化

随便推点

数据结构学习笔记(全)_数据结构笔记整理-程序员宅基地

文章浏览阅读619次,点赞2次,收藏27次。若有两个孩子,其右孩子为q,则将左孩子的最右边结点p删除,并将p放在被删除的根节点的位置,如果被删除的p有左子树,则直接继承在p的位置。从图中的某个顶点V0出发,并在访问此顶点之后 依次访问V0的所有未被访问过的邻接点,之后按这 些顶点被访问的先后次序依次访问它们的邻接点,直 至图中所有和V0有路径相通的顶点都被访问到。先选择一个顶点(无要求),选择权值最短的边,将其与一个新的顶点连接,并将其看为一个新的整体,重复进行”选择权值最短的边,将其与一个新的顶点连接“的操作直至所有顶点相连。_数据结构笔记整理

[开发|C++] 在 Ubuntu20.04系统上编译gcc-4.9.4_ubuntu20.04 gcc9.4.0编译gcc4.9.2-程序员宅基地

文章浏览阅读566次,点赞11次,收藏9次。5. 报错信息如下。7. 报错信息如下。_ubuntu20.04 gcc9.4.0编译gcc4.9.2

3小时零基础入门微信小程序开发2024年最新版-程序员宅基地

文章浏览阅读964次,点赞27次,收藏25次。用大白话讲:变量就是一个装东西的盒子再通俗些讲:变量就是用于存放数据的容器,我们通过变量名获取对应的数据。如上图所示,我们的盒子(变量)可以装名字,布尔类型的true,还可以用来装数字。变量的本质:就是在程序的内存中申请一块用来存放数据的空间。对象只是一种特殊的数据。对象是一组无序的相关属性和方法组成。这里重点要记住属性和方法这两个新概念属性:事物的特征,对象里的属性就是用来表现该对象具备哪些特征方法:事物的行为,对象里方法就是用来表示该对象具备哪些行为。

Bellman-Ford算法详讲_bellmanford算法不能处理什么情况-程序员宅基地

文章浏览阅读272次。Dijkstra算法是处理单源最短路径的有效算法,但它局限于边的权值非负的情况,若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的。这时候,就需要使用其他的算法来求解最短路径,Bellman-Ford算法就是其中最常用的一个。该算法由美国数学家理查德•贝尔曼(Richard Bellman, 动态规划的提出者)和小莱斯特•福特(Lester Ford)发明。适_bellmanford算法不能处理什么情况

中国人必须知道的76个常识_中国人必须知道的常识-程序员宅基地

文章浏览阅读501次。1.【十二生肖】子鼠、丑牛、寅虎、卯兔、辰龙、巳蛇、午马、未羊、申猴、酉鸡、戌狗、亥猪2.【十大名茶】西湖龙井(浙江杭州西湖区)、碧螺春(江苏吴县太湖的洞庭山碧螺峰)、信阳毛尖(河南信阳车云山)、君山银针(湖南岳阳君山)、六安瓜片(安徽六安和金寨两县的齐云山)、黄山毛峰(安徽歙县黄山)、祁门红茶(安徽祁门县)、都匀毛尖(贵州都匀县)、铁观音(福建安溪县)、武夷岩茶(福建崇安县)3.【四大名绣】苏绣(苏州)_中国人必须知道的常识

MFC C++打造文件资源管理器(树控件版)_mfc 资源管理器-程序员宅基地

文章浏览阅读1.9k次,点赞3次,收藏23次。123_mfc 资源管理器