点的方式操作属性与attr相关:
中括号的方式操作属性与item系列相关
import sys,os
BASEDIR = os.path.dirname(os.path.dirname(os.path.abspath(file)))
sys.path.append(BASEDIR)
if name == ‘main’:
class Foo:
x = 1
def __init__(self, name):
self.name = name
def __getitem__(self, item):
print('getitem执行啦')
return self.__dict__[item]
def __setitem__(self, key, value):
print('setitem执行啦')
self.__dict__[key] = value
def __delitem__(self, key):
print('delitem执行啦')
self.__dict__.pop('name')
def __getattr__(self, item):
print('getattr执行啦')
def __setattr__(self, key, value):
print('setattr执行啦')
self.__dict__[key] = value
def __delattr__(self, item):
print('delattr执行啦')
f1 = Foo('zhangli') #触发__setattr__
f1.name = 'zhouyun' #触发__setattr__
del f1.name #触发__delattr__
f1.y #在没有查找到属性时,触发__getattr__
f1['name'] #触发__getitem__
f1['name'] = 'yuanhao' #触发__setitem__
del f1['name'] #触发__delitem__
输出:
setattr执行啦
setattr执行啦
delattr执行啦
getattr执行啦
getitem执行啦
setitem执行啦
delitem执行啦