1 getattr(self,name)
定义当用户试图获取一个不存在的属性时的行为
getattr【被访问的属性不存在时】自动调用的魔法方法
2 getattribute(self,name)
对于python来说,属性或者函数都可以被理解成一个属性,且可以通过__getattribute__获取
getattribute#【属性在被访问时】自动调用的魔法方法
3 setattr(self,name,value)
4 delattr(self,name)
>>> class C:
def __getattribute__(self,name):
print('getattribute')
return super().__getattribute__(name)
#super会自动获取基类的属性,他这里没有所以会获取object
def __getattr__(self,name):
print('getattr')
def __setattr__(self,name,value):
print('setattr')
super().__setattr__(name,value)
def __delattr__(self,name):
print('delattr')
super().__delattr__(name)
>>> c=C()
>>> c.x
getattribute
getattr
>>> c.x=1
setattr
>>> del c.x
delattr
描述符:就是将某种特殊类型的类的实例指派给另一个类的属性
1 get(self,instance,owner)
用于访问属性,返回属性的值
2 set(self,instance,value)
在属性分配操作中调用,不返回任何内容
3 delete(self,instance)
控制删除操作
协议protocols
协议类似某些语言的接口,里面包含的是一些必须要实现的方法
定制容器
(1)如果希望容器不可变(e.g 元组)只需定义:
len(self) 返回容器中元素个数
getitem(self,key) 获取容器中指定元素
(2) 如果希望容器可变
除了__len__()和__getitem__()还需定义:
setitem(self,key,value) 设置容器中指定元素
delitem(self,key) 删除容器中元素
(一个参数加*表示未知个数)
迭代器
1 iter() 将一个可以迭代的对象转为迭代器对象
2 next() 返回迭代器的一个元素,可设置参数变量
>>> string='apple'
>>> it=iter(string)
>>> next(it)
'a'
>>> next(it)
'p'
魔法方法
1.iter()
2. next()