目录
- 一、__str__
- 二、__setattr__,__delattr__,__getattr__(重要)
- 实例
- 三、__item__系列
- 四、__call__
一、__str__
如果不重写__str__ 直接print打印对象时,会打印出内存地址
class Foo:
def __init__(self,name):
self.name=name
def __str__(self):
return '['+self.name+']'
f=Foo('xc')
print(f)
二、__setattr__,__delattr__,__getattr__(重要)
点拦截方法
如果去对象中取属性,一旦取不到,会进入到__getattr__
如果去对象中赋值属性,一旦取不到,会进入到__setattr__
如果删除对象中的属性,会进入__delattr__
实例
class Foo:
def __init__(self,name):
self.name=name # 会进入__setattr__(因此不会赋值)
# 重写__getattr__
def __getattr__(self, item):
print('xxxx')
return '你傻逼啊,没有这个字段'
# 重写__setattr__
def __setattr__(self, key, value):
print('yyyyy')
# 重写__delattr__
def __delattr__(self, item):
print('zzzzz')
f=Foo('xc')
print(f.name) # 会进入__getattr__
print(f.age) # 会进入__getattr__
print(f.__dict__)
print(f.name) # 会进入__getattr__
f.sex='male' # 会进入__setattr__(因此不会赋值)
del f.name # 会进入__delattr__
print(f.__dict__)
yyyyy
xxxx
你傻逼啊,没有这个字段
xxxx
你傻逼啊,没有这个字段
{}
xxxx
你傻逼啊,没有这个字段
yyyyy
zzzzz
{}
三、__item__系列
对象通过[] 中括号取值,赋值,删除值的时候,会调用
class Foo:
def __init__(self, name):
self.name = name
def __getitem__(self, item):
name=getattr(self,item)
print(name)
return name
def __setitem__(self, key, value):
print('obj[key]赋值时,执行我')
self.__dict__[key] = value
def __delitem__(self, key):
print('del obj[key]时,执行我')
self.__dict__.pop(key)
f=Foo('xc')
f["a"] = "123"
print(f['name'])
del f["a"]
print(f.__dict__)
obj[key]赋值时,执行我
{'name': 'xc', 'a': '123'}
xc
xc
del obj[key]时,执行我
{'name': 'xc'}
四、__call__
对象加括号会调用它
class Foo:
def __call__(self):
print('xxxx')
f=Foo()
f()
print(f.__dict__)
xxxx
{}