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__的更多相关文章

  1. python __setattr__, __getattr__, __delattr__, __call__

    python __setattr__, __getattr__, __delattr__, __call__ getattr `getattr`函数属于内建函数,可以通过函数名称获取 value = ...

  2. python 中__setattr__, __getattr__,__getattribute__, __call__使用方法

    object._getattr_(self, name) 拦截点号运算.当对未定义的属性名称和实例进行点号运算时,就会用属性名作为字符串调用这个方法.如果继承树可以找到该属性,则不调用此方法 实例in ...

  3. __getattr__ __delattr__ __setattr__ __getattribute__使用(重写python提供的错误信息)

    自己定义了这些attr 查找删除设置就会触发自己定义的逻辑,如果不重新,pyton会提供自己报错信息class Room: def __init__(self,name): self.name = n ...

  4. python中的__getattr__、__getattribute__、__setattr__、__delattr__、__dir__

    __getattr__:     属性查找失败后,解释器会调用 __getattr__ 方法. class TmpTest: def __init__(self): self.tmp = 'tmp12 ...

  5. 类的专有方法(__getattr__和__setattr__、__delattr__)

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #http://www.360doc.com/content/15/0413/19/12067640_4629 ...

  6. python面对对象编程-------5:获取属性的四种办法:@property, __setattr__(__getattr__) ,descriptor

    一:最基本的属性操作 class Generic: pass g= Generic() >>> g.attribute= "value" #创建属性并赋值 > ...

  7. python类内部方法__setattr__ __getattr_ __delattr__ hasattr __getattribute__ __getitem__(),__setitem__(), __delitem__()

    主要讲类的内部方法 __setattr__  __getattr_  __delattr__  hasattr  __getattribute__  __getitem__(),__setitem__ ...

  8. __getattribute__()、__getattr__()、__setattr__()、__delattr__()

    访问顺序: 实例的__getattribute__().Descriptor的__get__().实例的__dict__.只读Descriptor的__get__().实例的__getattr__() ...

  9. __setattr__和__delattr__和__getattr__

    目录 一.__setattr__ 二.__delattr__ 三. __getattr__ class Foo: x = 1 def __init__(self, y): self.y = y def ...

随机推荐

  1. return new Promise的时候,不能带着.then()方法

    app.js return new Promise的同时带着.then()方法会出错 return出去的这个Promise,整体状态会显示pending,虽然详细里状态显示resolve,但是没有re ...

  2. php类知识----特别用法

    spl_autoload_register注册 <?php #spl_autoload_register-----这个例子是用来打印实例化类的类名 function thereisagameof ...

  3. js 实现深拷贝

    在ECMAScript变量中包含两种不同类型的值:基本类型值和引用类型值. 基本类型值:Undefined.Null.Boolean.Number.String 引用类型值:Object.Array. ...

  4. [Algorithm] Finding all factors of a number

    12's factors are: {1,2,3,4,6,12} function factors (n) { let list = []; for (let i = 1; i < Math.s ...

  5. uniapp上传图片转base64码

    uni.chooseImage({ count: 9, success: res => { this.imageList = this.imageList.concat(res.tempFile ...

  6. Python数学常量

    常量 描述 pi 数学常量 pi(圆周率,一般以π来表示) e 数学常量 e,e即自然常数(自然常数).

  7. [笔记]nginx配置反向代理和负载均衡

    1.nginx配置文件:源码安装情况下,nginx.conf在解压后的安装包内.yum安装,一般情况下,一部分在/etc/nginx/nginx.conf中,一部分在/etc/nginx/conf.d ...

  8. BZOJ1718分离的路径

    边双题. 求的就是最少加几条边可以使一个图变成边双联通图. 首先tarjan求一下边双,缩完点变成一颗树,统计度数为1的点(无根树的叶子),把这个数算出来,设为x,则ans=(x+1)/2. 这个可以 ...

  9. 2018-2019-2 20165215《网络对抗技术》Exp9 :Web安全基础

    目录 实验目的及内容 实验过程记录 一.Webgoat安装 二. 注入缺陷(Injection Flaws) (一)命令注入(Command Injection) (二)数字型注入(Numeric S ...

  10. PHP冒泡排序原生代码

    //冒泡排序 $arr=array(23,5,26,4,9,85,10,2,55,44,21,39,11,16,55,88,421,226,588); $n =count($arr); //echo ...