一、内置方法
__init__ 在对象实例化的时候自动调用的
- __str_:如果不重写__str_ print打印会打印出内存地址,如果重写了,会打印出你想要的
__repr__ 跟str类似,在交互式命令下直接写变量名,会执行__repr__
__str__
1.不写__str__ class Foo: def __init__(self,name): self.name=name # def __str__(self): # return '['+self.name+']' f=Foo('nick') print(f.__str__())
<main.Foo object at 0x00000201444E77F0>
2.写__str__ class Foo: def __init__(self,name): self.name=name def __str__(self): return '['+self.name+']' f=Foo('xichen') print(f.__str__())
[xichen]
l=[1,2,3] # #本质也是调用list的__str__方法 print(l)
[1, 2, 3]
1.__setattr__
- 添加/修改属性会触发它的执行
- 如果去对象中赋值属性,一旦取不到,会进入到__setattr__
class Foo:
def __init__(self,name):
self.name=name
def __setattr__(self, key, value):
print('对象没有这个属性')
1.原来字典使用方式dict
dic = dict(name='xichen',age=18)
print(dic)
print(dic ['name'])
{'name': 'xichen', 'age': 18}
xichen
2.写一个类继承字典,让它可以 .取值,可以中括号取值
class Mydict(dict): # 继承dic这个类
def __init__(self,**kwargs):
super().__init__(**kwargs)
def __getattr__(self, item):
print(item)
return self[item]
def __setattr__(self, key, value):
self[key]=value
di=Mydict(name='xichen',age=18)
print(di['name'])
print(di.name)
di.sex='male'
di['sex']='male'
di.age=18
print(di.age)
xichen
xichen
18
2.__getattr__
- 只有在使用点调用属性且属性不存在的时候才会触发
- 如果去对象中取属性,一旦取不到,会进入到__getattr__
class Foo:
def __init__(self,name):
self.name=name
def __getattr__(self, item):
return '没有这个字段'
f = Foo('xichen')
print(f.age)
没有这个字段
3.__delattr__
- 删除属性的时候会触发
- 如果删除对象中的属性,会进入__delattr__
class Foo:
def __init__(self,name):
self.name=name
def __delattr__(self,item):
self.__dict__.pop(item)
print('删除成功')
del f.name
print(f.__dict__)
删除成功
{'age': 18}
4.__item__系列
- 对象通过[] 中括号取值,赋值,删除值的时候,会调用
class Foo:
def __init__(self, name):
self.name = name
def __getitem__(self, item):
name=getattr(self,item)
# print(name)
# print(self.__dict__[item])
return name
# return self.__dict__[item]
def __setitem__(self, key, value):
print('obj[key]=lqz赋值时,执行我')
self.__dict__[key] = value
def __delitem__(self, key):
print('del obj[key]时,执行我')
self.__dict__.pop(key)
f=Foo('xichen')
print(f['name'])
xichen
- __setitem__
f['age'] = 18
print(f['age'])
print(f.__dict__)
obj[key]=lqz赋值时,执行我
18
{'name': 'xichen', 'age': 18}
- __delitem__
del f['age']
print(f.__dict__)
del obj[key]时,执行我
{'name': 'xichen'}
5.__call__:对象加括号会调用它
class Foo:
def __call__(self):
print('调用我 !')
f=Foo()
f()
调用我 !
6.__enter__和__exit__
- 本质是,上下文管理器
- 就是我们用with open 打开文件的时候,是触发了__enter__,帮我们打开文件
- 当系统检测到我们是顶格写的时候实际上就是触发了__exit__,所以帮我们自动释放了资源
with open('path','r') as f:
pass