首页 > 其他分享 >魔术方法

魔术方法

时间:2024-11-30 18:54:25浏览次数:4  
标签:__ setattr self 魔术 prop1 prop2 foo 方法

定制化属性访问###

getattribute(self, name): 被称作属性拦截器, 即所有对实例属性的访问都会先受到此方法的影响。此方法应该返回一个我们处理后的值,或者抛出一个AttributeError异常。 此方法应该谨慎使用。一般我们对个别属性做特殊处理后,都要加一个调用父类该方法,以免无限递归调用。
getattr(self, name): 当按照普通的属性访问方法访问不到一个属性时(即遇到AttributeError异常),此方法将被触发。这个方法也该要么返回一个处理后的值,要么抛出AttributeError异常。
setattr(self, name, value): 会拦截普通的属性赋值操作(也包括属性不存在时的创建并赋初值)。如果希望数据赋值给实例属性,则应该调用父类方法防止无限递归。
delattr(self, name): 当删除一个属性时,会触发此方法。比如 del obj.prop

使用上面这些方法,可以高度定制对属性的访问,修改,删除等操作。比如,可以控制不将属性存储在实例的__dict__里,而是存储在某个指定的对象里。

class Foo():
    def __getattribute__(self, item):
        if item == 'prop1':
            return '被拦截了'
        else:
            # return self.item # 这种写法会造成无限递归
            return super().__getattribute__(item)
        
    def __getattr__(self, name):
        return '被__getattr_了'
    
    def __setattr__(self, key, value):
        if key == 'prop2':
            # self.prop2 = '被__setattr__了'  # 这种写法会造成无限递归
            super().__setattr__(key, '被__setattr__了')
        else:
            super().__setattr__(key, value)


foo = Foo()
foo.prop1 = 'prop1'
foo.prop2 = 'prop2'

print('dir:', dir(foo))
print('vars:',vars(foo))
print('__dict__:',foo.__dict__)
print('foo.prop1:', foo.prop1)
print('foo.prop2:', foo.prop2)
print('foo.prop3:', foo.prop3)

返回结果:

dir: ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattr__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'prop1', 'prop2']
vars: {'prop1': 'prop1', 'prop2': '被__setattr__了'}
__dict__: {'prop1': 'prop1', 'prop2': '被__setattr__了'}
foo.prop1: 被拦截了
foo.prop2: 被__setattr__了
foo.prop3: 被__getattr_了

标签:__,setattr,self,魔术,prop1,prop2,foo,方法
From: https://www.cnblogs.com/rolandhe/p/18578757

相关文章

  • 2个方法教打开把Word文档转换为PDF格式
    在日常工作和学术研究中,我们经常需要将Word文档转换为PDF格式,以便于共享和确保文档格式的稳定性。下面将介绍2种将Word文档转换为PDF的方法,并探讨在转换过程中需要注意的事项。方法一、使用MicrosoftWord自带的功能使用MicrosoftWord自带的功能进行Word转PDF,能够确保文件......
  • 电脑内存爆红重复文件太多怎么办?3个重复文件删除方法
    日常工作中,我们使用电脑的时间长了,都会累积大量好的文件,这其中难免会出现重复文件。这些重复文件不仅占用了电脑磁盘空间,还会降低电脑性能。因此,我们必须定期对重复文件查找出来并清理删除掉,那要怎么对重复文件进行查找并清理呢?今天小编就给大家分享几个文件去重方法,都是一些比......
  • 4个方法教大家如何辨别iPhone手机是不是翻新机?
    大家都知道,iPhone手机利润非常可观,这也吸引无数商家涌入这个肥水市场,随之而来的就是各种翻新机、高仿机。大家平时有留意那些被回收了的电子产品吗?知道它们去了哪里吗?大部分低价回收的电子产品会通过各种渠道转到翻新商家那边进行处理,他们通过拆解,清理有用的零配件,再利用这......
  • BurpSuite使用篇--抓包方法与解码器
    BurpSuite是一个web渗透利器,可以抓包改包也可以扫描漏洞,将漏洞扫描和利用集成化一体,更可以支持外部插件拓展,非常牛的工具。那我们怎么使用呢?使用BurpSuite老版本中BurpSuite需要在浏览器中配置本地代理,还需要导入证书,非常不方便,新版本中BurpSuite自带一个浏览器,不需要经过浏......
  • 关于创建新登录用户使用SQL Server验证登录时报错全过程解决方法(错误: 18456,不包含网
    想必大家在创建新登录用户时会遇到一些问题例如:但是账号密码都已经反复确认过没错了之前我在很多博文看到的解决方法都不能正确解决这个问题,接下来我就来解决下这个问题1.首先创建一个新的登录用户下面配置是这样子的:登录名testlogin密码123下面这张图注意了!如果你......
  • Qt for Android的配置方法及遇到的常见问题
    一、QtforAndroid的配置方法:安装正确版本的JavaJDK(经测试,qt6.7.3版本对应于JavaJDK17),并在环境变量中进行添加,Windows控制台使用命令java--version可验证环境变量是否添加成功并查看安装的Java版本。在Qtcreator中进行配置:2.1配置JDK位置后,点击设置SDK可以自动下......
  • 公司网站资料如何修改,公司网站资料更新方法
    更新公司网站的资料通常涉及编辑内容和图片,以下是一些具体步骤:登录后台:打开网站的后台管理页面,输入用户名和密码登录。找到需要修改的页面:在后台的“内容管理”模块中,找到需要编辑的页面或文章。点击“编辑”按钮,进入编辑页面。修改内容:编辑页面的标题、正文、......
  • 如何在织梦网修改网站 织梦网修改网站方法
    登录后台:打开织梦网的后台管理页面,输入用户名和密码登录。编辑内容:在后台的“内容管理”模块中,找到需要编辑的页面或文章。点击“编辑”按钮,进入编辑页面。修改页面的标题、正文、关键词等信息,保存修改。编辑模板:在后台的“模板管理”模块中,找到需要编辑的模板......
  • 网站里面的h5怎么修改,H5页面内容更新方法
    H5页面(HTML5页面)的修改通常涉及以下几个步骤:定位文件:找到包含H5页面的文件。这些文件通常位于网站的根目录或特定的子目录中,文件扩展名为.html或.htm。编辑工具:使用文本编辑器(如SublimeText、VSCode、Notepad++等)打开H5文件。修改内容:根据需要修改HTML代码。常见的修改包括:......
  • IDEA本地运行Spark程序报错:HADOOP_HOME and hadoop.home.dir are unset. 解决方法
    报错信息java.lang.RuntimeException:java.io.FileNotFoundException:java.io.FileNotFoundException:HADOOP_HOMEandhadoop.home.dirareunset.-seehttps://wiki.apache.org/hadoop/WindowsProblems atorg.apache.hadoop.util.Shell.getWinUtilsPath(Shell.java:737)......