Python下划线方法中 __getattr__,__setattr__, __delattr__

Python小tips和学习整理 Python小tips和学习整理在类中单下划线_或双下划线开头的函数和变量的意义getattr()函数和与之相关的函数hasattr(object, name)getattr(object, name, default)setattr(object, name, default)delattr(object,'name') 在类中单下划线_或双下划线开头的函数和变量的意义   Python在类中的... 阅读详情

1、__getattr__

当我们访问一个不存在的属性的时候,会抛出异常,提示我们不存在这个属性。而这个异常就是__getattr__方法抛出的,其原因在于他是访问一个不存在的属性的最后落脚点,作为异常抛出的地方提示出错再适合不过了。

看例子,我们找一个存在的属性和不存在的属性。可以看出,访问存在的属性时,会正常返回值,若该值不存在,则会进入最后的兜底函数__getattr__。

class A(object):
    def __init__(self, value):
        self.value = value
 
    def __getattr__(self, item):
        print "into __getattr__"
        return  "can not find"
 
a = A(10)
print a.value
# 10
print a.name
# into __getattr__
# can not find

 

2、__setattr__

在对一个属性设置值的时候,会调用到这个函数,每个设置值的方式都会进入这个方法。

class A(object):
    def __init__(self, value):
        print "into __init__"
        self.value = value
 
    def __setattr__(self, name, value):
        print "into __setattr__"
        if value == 10:
            print "from __init__"
        object.__setattr__(self, name, value)
 
 
a = A(10)
# into __init__
# into __setattr__
# from __init__
print a.value
# 10
a.value = 100
# into __setattr__
print a.value
# 100

在实例化的时候,会进行初始化,在__init__里,对value的属性值进行了设置,这时候会调用__setattr__方法。

在对a.value重新设置值100的时候,会再次进入__setattr__方法。

需要注意的地方是,在重写__setattr__方法的时候千万不要重复调用造成死循环。

比如:

class A(object):
    def __init__(self, value):
        self.value = value
 
    def __setattr__(self, name, value):
        self.name = value

这是个死循环。当我们实例化这个类的时候,会进入__init__,然后对value进行设置值,设置值会进入__setattr__方法,而__setattr__方法里面又有一个self.name=value设置值的操作,会再次调用自身__setattr__,造成死循环。

除了上面调用object类的__setattr__避开死循环,还可以如下重写__setattr__避开循环。

class A(object):
    def __init__(self, value):
        self.value = value
 
    def __setattr__(self, name, value):
        self.__dict__[name] = value
 
 
a = A(10)
print a.value
# 10

 

3、__delattr__

__delattr__是个删除属性的方法

class A(object):
    def __init__(self, value):
        self.value = value
 
    def __delattr__(self, item):
        object.__delattr__(self, item)
 
    def __getattr__(self, item):
        return "when can not find attribute into __getattr__"
 
 
 
a = A(10)
print a.value
# 10
del a.value
print a.value
# when can not find attribute into __getattr__

__delattr__也要避免死循环的问题,就如__setattr__一样,在重写__delattr__,避免重复调用。 

Python中使用__setattr__动态定义实例属性和方法 在这个示例中,我们创建了MyClass类的一个对象obj,并使用__setattr__方法动态定义了一个名为"my_new_attr"的实例属性和一个名为"my_new_method"的实例方法。__setattr__方法是一个特殊的方法,用于在设置对象属性时调用。通过重载__setattr__和__getattr__方法,我们可以实现自己的属性和方法操作方式,以满足我们的特定需求。上述代码定义了一个名为MyClass的类,该类重载了__setattr__、__getattr__和__dir__方法。 阅读详情

相关推荐

Python __getattr__与__setattr__使用方法

比如下面的例子: class Book(object):    def __setattr__(self, name, value):        if name == ‘value’:            object.__setattr__(self, name, value – 100)        else:            object.__setattr__(self, name, value)    def __getattr__(self, name):        try:            return object.__getattribute__(na

Python魔法方法(13):__setattr __(self, key, value) 方法

Python 的对象天生拥有一些神奇的方法,它们总被双下划线所包围,它们是面向对象的 Python 的一切。它们是可以给你的类增加魔力的特殊方法,如果你的对象实现(重载)了某一个魔法方法,那么这个方法就会在特殊的情况下自动被 Python 所调用。......

youzhouliu的博客 1514

ZYNQ双核通信实战:手把手教你用OpenAMP搭建Linux+FreeRTOS开发环境(2018.3版)

本文详细介绍了如何在ZYNQ平台上使用OpenAMP框架实现双核通信,构建Linux与FreeRTOS协同开发环境。从开发环境配置、系统组件编译到OpenAMP框架应用,手把手指导开发者完成ZYNQ双核通信系统的搭建与调试,为异构计算开发提供实用解决方案。

weixin_33737134的博客 475

第8.28节 Python中使用__setattr__定义实例变量和实例方法

一、 引言 根据前面章节介绍的内容,我们知道实例变量、实例方法的定义可以通过以下方法进行: 在类体中直接定义实例变量、实例方法; 在实例方法中定义实例变量、实例方法; 在类体外调用方使用赋值语句赋值定义实例变量、实例方法; 给实例的__dict__字典中插入元素定义实例可以定义实例变量。 其实还有一种方法,就是调用object类的__setattr__方法,也可以在实例方法或类体外定义实例变量、...

老猿Python 3629

基于gem5模拟trace的cache模拟器的实现

在做计算机体系结构的时候,模拟器是一个重要且又有效的工具。其中gem5集成了gem和m5的优点,使用起来比较简单和方便。其中包括了se模式和fs模式,se模式是在gem5运行我们已经编译好的程序,可以获取cache,cpu状态等数据,fs模式下可以模拟操作系统,我们可以将我们自己修改的linux内核加载到哥们上运行。下面介绍了使用gem5的se模式,运行编译好的ARM可执行文件。获取访存的trac

gaoxiang的专栏 8891

传统芯片封装工艺流程简介

塑封是将工件和树脂安装在模具中,加热模具,使树脂液化充满模具,降温保持一定时间后,树脂凝结为固态即可取出。它将一个大的晶圆切割成许多单独的小块,每个小块是一个“芯片”(Chip,die),这些芯片是单个集成电路的基本单位。对裸露在外的引线框架外脚电镀Sn-Pb合金,这样不仅可以提高外脚的抗氧化性,还有利于后续与印刷电路板的焊接。导电胶粘贴法:将含有银粉的环氧树脂(银浆)涂敷在框架或基板上,再将芯片放置其上,固化后可以将芯片牢牢粘接。引线框架的各腿是用筋连接着的,起支撑作用,塑封固化后,需要将其连筋切掉。

芯想是陈的博客 3190

__setattr__

setattr是一个强大的工具,允许你自定义对象属性的设置行为。通过重载setattr,你可以添加验证逻辑、日志记录或其他自定义行为。然而,使用setattr时需要注意避免无限递归调用,并考虑到可能的性能影响。合理使用setattr可以使你的代码更加灵活和强大。

离开那天的博客 579

Ubuntu18.04 SoftRoCE安装教程

目标:创建两台Ubuntu18.04虚拟机,安装SoftRoCE环境,一台作为Server,一台作为Client,模拟RDMA通信环境,熟悉RDMA的通信方式。

GGGYL111的博客 1548

Python:setattr()函数和__setattr__()魔术方法

setattr()是一个python内置的函数,用于设置一个对象的属性值,一般情况下,可以通过点运算符(.)完成相同的功能,但是getattr()拥有一个点运算符无法实现的功能,就是允许使用字符串(甚至字符串内容可以不是一个标识符)来表示属性名,从而可以在运行时动态地选择要设置的属性,这对于编写通用的代码或者处理动态数据结构很有用。

保持终身学习的能力,温故而知新 1253

ArcGIS中地理坐标系与投影坐标系以及投影转换

简单介绍arcgis软件中坐标系定义、设置和常见问题。

weixin_41399650的博客 8万+

立创EDA手动拼板实战:当自带功能不够用,如何用‘复制粘贴’搞定异形拼版与特殊布局

本文详细介绍了立创EDA手动拼板技术在异形拼版与特殊布局中的应用实战。通过CTRL+SHIFT+V等核心操作技巧,解决混合尺寸拼板、特殊间距需求等复杂场景,提升PCB设计效率与灵活性,特别适合需要高精度控制的射频电路和医疗设备项目。

weixin_31967485的博客 386

Python 中的反射操作

**内容概览:** 1、反射 2、实例化对象的反射操作 3、类名的反射操作 4、其他 py 文件的反射操作 5、本py文件的反射操作 6、特殊双下划线方法 7、单例模式 8、item 系列 反射 反射有四个方法:hasattr、getattr、setattr、delattr,比较常用的是前两种,一般会结合起来用。 最最重要的一点:通过字符串去操作对象的属性和方法,是字符串形式! 什么对象可以用反射? 实例化对象、类、其他模块、本模块 只有以上四个才能使用,因为他们都能通过 . 的方式获取或调用,这也算是一

jianglianye21的博客 674

Windows加域迁移避坑指南:Profwiz工具实战中的5个常见问题与解决方案

本文详细解析了使用Profwiz工具进行Windows加域迁移时的5个常见问题及解决方案,包括临时配置文件生成、密码策略冲突、SID冲突等。通过实战案例和优化技巧,帮助IT运维团队高效完成账户配置文件迁移,确保Active Directory环境下的数据完整性和权限无缝衔接。

q9r0s的博客 517

python的单下划线和双下划线

python 类中的单下划线开头的变量表示:该方法为类的私有方法,原则上外部不能访问,但是用._XX是可以访问到的 双下划线开头则是强制外部不能直接访问的用.__XX是访问不到的,它内部其实是将变量名重新命名为:_类名__变量名,所以可以通过._类名__变量名访问 #_*_coding:utf-8_*_ __author__ = 'Linhaifeng' class People:...

weixin_30896763的博客 89

智慧加油站小程序数据库设计文档

【代码】智慧加油站小程序数据库设计文档。

低代码布道师的博客 1402

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

面向对象之反射

反射的四个相关方法: 1 1 #Author : Kelvin 2 2 #Date : 2019/1/17 20:15 3 3 4 4 # hasattr setattr getattr delattr 5 5 class People: 6 6 def __init__(self,name,addr): 7 7 sel...

weixin_30429201的博客 68

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

python继承父类属性_python继承和动态属性

一、私有属性私有属性: __开头或者_开头,即双下划线开头的叫做私有属性,不能再类外部使用,只能在类里面使用私有方法:__开头或者_开头注意点:以后看到_下划线开头的属性或者方法,都不要去动或者使用classSOS:attr= 100_attr= 222 #这是单下划线,在外部访问,但是不要在类外部使用__attr = 999 #这是双下划线,强制拒绝外部访问print(SOS.attr) ...

weixin_39588104的博客 819

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Python_基础_(反射)

一,反射 1:反射:自省也称为反射,这个性质展示了某个对象是如何在运行期间取得自身的信息 2:如果传递一个对象给你,你应该可以查出该对象具有的能力,在Python中如果不具有自省能力,那么dir和type内建立的函数就无法正常的工作 3:反射指的是程序可以访问,检测,修改本身状态或行为的一种能力 ## 四个可以实现自省的函数(适用于类和对象) # 1:检测字符串name对应的属...

weixin_34306446的博客 87

十一、python中继承和属性动态操作

继承和属性动态操作 私有属性:仅供类的内部使用(不要在外部调用) _单下划线开头:表示这是一个私有属性(没有真正的私有化,外部依然可以调用) __双下划线开头: 表示这是一个私有属性(类外部不可以调用) 私有方法:仅供类的内部使用(不要在外部调用) _单下划线开头:表示这是一个私有方法(没有真正的私有化,外部依然可以调用) __双下划线开头: 表示这是一个私有方法(类外部不可以调用) 实例方法: ​ 1、只能通过对象调用(第一个参数self:代表对象本身)、 ​ 2、...

小白的学习日志 650

Python类的内建函数

1. issubclass()函数 issubclass()是一个布尔函数,这个函数用来判断一个类是否是另外一个类的子类或者子孙类。如果给出的子类确实是给出的父类的子类,则返回True,否则返回False。 它的语法如下: issubclass(subclass, parentclass) parentclass也可以是一个包含若干个父类的元组,只要子类属于元组中某一个父类,则返回True,否则返回False。 2. isinstance()函数 isinstance()是一个布尔函数,这个函数用

Bo_B0的博客 1290

类的内置方法__attr__介绍

1、hasattr getaddr setaddr delattr 这四个函数同样也适用于类 class BlackMedium: feture="Ugly" def __init__(self,name,addr): self.name=name self.addr=addr def sell_house(self)...

weixin_30889885的博客 138

面向对象之反射、包装、(定制)

什么是反射? 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省), 这一概念的提出很快引发了计算机科学领域关于应用反射的研究。它首次被程序语言的设计领域所采用。并在Lisp和面向 对象方面取得了成绩。 一、python3中四个可以实现自省的函数,下列方法适用于类和对象 class BlackMedium: ...

weixin_30408309的博客 69

【三十六】面向对象编程

【三十六】面向对象编程【三十六】面向对象编程

weixin_46395534的博客 252

58、Python 反射及双下方法

Python 反射及双下方法 一.反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。 python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射) 四个可以实现自省的函数 下列方法适用于类和对象(一切皆对象,类本身也是一个对象) 1.1 对象的反射 c

Mrrunsen的博客 133

python学习(四):python变量和函数

python用下划线作为变量前缀和后缀指定特殊变量 _xxx 不能用’from module import *’导入 __xxx__ 系统定义名字 __xxx 类中的私有变量名 核心风格:避免用下划线作为变量名的开始。   因为下划线对解释器有特殊的意义,而且是内建标识符所使用的符号,我们建议程序员避免用下划线作为变量名的开始。一般来讲,变量名_xxx被看作是“私有 的”,在模块或类外...

zlrai5895的博客 351

Python面向对象进阶

一、面向对象那个进阶之反射   定义:所谓反射就是可以通过字符串来操作Python代码中的变量、函数、甚至类和方法。     在反射中有四种自省方法,这四种方法适合类和对象(在Python中一切皆对象),下面是四种方法的说明:       hasattr 判断某一个 变量 是否能够.调用一个名字,返回True或者False       getattr 直接获取一个变量中的名字的值...

dianyan7795的博客 143
上一篇: python 函数与方法的区分与示例
下一篇: Redis添加到系统服务,以及添加到环境变量
Python_bh
博客等级 码龄7年 11粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值