__setattr__,__getattr__,__delattr__
class Foo:
x = 1
def __init__(self,y):
self.y = y
def __getattr__(self,item):
print("---->from getattr:你找的属性不存在")
def __setattr__(self,key,value):
print('----> from setattr')
# self.key = value # 这样就无限递归
# self.__dict__[key] = value #应该这样写
def __delattr__(self,item):
print("---> from delattr")
# del self.item
# 上面的写法同样会无限递归
self.__dict__.pop(item)
def __getitem__(self,item):
print('---->from getitem')
def __setitem__(self,item,value):
print('---from setitem')
def __delitem__(self,item):
print('---->from __delitem__')
# __setattr__:添加/修改属性就会触发它的执行
# 写的原理就是将属性和值写进对象的底层字典中,而我们重新写了
# __setattr__ 方法,所以不会写进去底层字典。
f1 = Foo(10)
f1['y'] = 10 # 触发__setitem__ 方法
print(f1.__dict__)
print(f1.__dict__)
f1.z = 3 # # 触发__setattr__
print(f1.__dict__)
# 除非是直接对底层字典进行操作,否则我们是永远无法赋值
f1.__dict__['z'] = 3
print(f1.z) #
# 此时f1 就有了z 属性
# __delattr__删除属性的时候会触发
f1.__dict__['a'] = 5
print(f1.__dict__) #{'z': 3, 'a': 5}
del f1.a # 触发__delattr__方法
del f1['a'] # 触发__delitem__方法
print(f1.__dict__) # {'z': 3}
# __getattr__ 只有在点调用属性且属性不存在的时候才会触发
f1.anc # 打印:---->from getattr:你找的属性不存在
f1['anc'] # 打印:---->from getitem:你找的属性不存在
__setattr__,__getattr__,__delattr__的更多相关文章
- python __setattr__, __getattr__, __delattr__, __call__
python __setattr__, __getattr__, __delattr__, __call__ getattr `getattr`函数属于内建函数,可以通过函数名称获取 value = ...
- python 中__setattr__, __getattr__,__getattribute__, __call__使用方法
object._getattr_(self, name) 拦截点号运算.当对未定义的属性名称和实例进行点号运算时,就会用属性名作为字符串调用这个方法.如果继承树可以找到该属性,则不调用此方法 实例in ...
- __getattr__ __delattr__ __setattr__ __getattribute__使用(重写python提供的错误信息)
自己定义了这些attr 查找删除设置就会触发自己定义的逻辑,如果不重新,pyton会提供自己报错信息class Room: def __init__(self,name): self.name = n ...
- python中的__getattr__、__getattribute__、__setattr__、__delattr__、__dir__
__getattr__: 属性查找失败后,解释器会调用 __getattr__ 方法. class TmpTest: def __init__(self): self.tmp = 'tmp12 ...
- 类的专有方法(__getattr__和__setattr__、__delattr__)
# -*- coding: utf-8 -*- #python 27 #xiaodeng #http://www.360doc.com/content/15/0413/19/12067640_4629 ...
- python面对对象编程-------5:获取属性的四种办法:@property, __setattr__(__getattr__) ,descriptor
一:最基本的属性操作 class Generic: pass g= Generic() >>> g.attribute= "value" #创建属性并赋值 > ...
- python类内部方法__setattr__ __getattr_ __delattr__ hasattr __getattribute__ __getitem__(),__setitem__(), __delitem__()
主要讲类的内部方法 __setattr__ __getattr_ __delattr__ hasattr __getattribute__ __getitem__(),__setitem__ ...
- __getattribute__()、__getattr__()、__setattr__()、__delattr__()
访问顺序: 实例的__getattribute__().Descriptor的__get__().实例的__dict__.只读Descriptor的__get__().实例的__getattr__() ...
- __setattr__和__delattr__和__getattr__
目录 一.__setattr__ 二.__delattr__ 三. __getattr__ class Foo: x = 1 def __init__(self, y): self.y = y def ...
随机推荐
- 部署安装python3.7
1:安装依赖包 yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-deve ...
- 8.JavaScript
1.JavaScript简介 JavaScript主要运行在客户端,用户访问带有JavaScript的网页,网页里的JavaScript程序就会传给浏览器,由浏览器解释和处理.表单数据的有效性验证等互 ...
- linux C线程
一个应用程序可以启动若干个线程: 线程,是程序执行的最小单位: 一般一个最简单的程序最少有一个线程,就是程序本身,也是主函数: 一个线程阻塞不会影响另一个线程: 多线程的进程可以尽可能多的利用系统CP ...
- 十一、spring插件
1.STS插件_ springsource-tool-suite插件各个历史版本 2.eclipse安装spring的插件 3.奇技淫巧:在spring官网上下载历史版本的spring插件,sprin ...
- Vue_(组件)自定义指令
Vue.js自定义指令 传送门 自定义指令:除了内置指令,Vue也允许用户自定义指令 注册指令:通过全局API Vue.directive可以注册自定义指令 自定义指令的钩子函数参数:自定义指令的钩子 ...
- beta week 2/2 Scrum立会报告+燃尽图 04
此作业要求参见https://edu.cnblogs.com/campus/nenu/2019fall/homework/9957 一.小组情况 组长:贺敬文组员:彭思雨 王志文 位军营 徐丽君队名: ...
- 5 Java 插入排序
1.基本思想 将数组中的所有元素依次跟前面已经排好的元素相比较,如果选择的元素比已排序的元素小则依次交换,直到出现比选择元素小的元素或者全部元素都比较过为止. 2.算法描述 ①. 从第一个元素开始,该 ...
- POJ 3128 Leonardo's Notebook (置换)
Leonardo's Notebook Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2324 Accepted: 98 ...
- linux中 ls |wc -l
linux中 ls |wc -l_百度知道 答 205行,205个字,1920个字节,wc -l只输出文件行数
- jmeter也能做Webservice接口测试
百度到天气预报接口:http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl 新增RPC接口线程 调取的参数及调取天气结果的显示 ...