属性相关
__getattr__(self, name) 定义当用户试图获取一个不存在的属性时的行为
__getattribute__(self, name) 定义当该类的属性被访问时的行为
__setattr__(self, name, value) 定义当一个属性被设置时的行为
__delattr__(self, name) 定义当一个属性被删除时的行为
__dir__(self) 定义当 dir() 被调用时的行为
__get__(self, instance, owner) 定义当描述符的值被取得时的行为
__set__(self, instance, value) 定义当描述符的值被改变时的行为
__delete__(self, instance) 定义当描述符的值被删除时的行为
""" file """
class Descriptor:
def __get__(self, instance, owner):
print('get...', type(self), type(instance), type(owner))
def __set__(self, instance, value):
print('set...', type(self), type(instance), type(value))
def __delete__(self, instance):
print('delete...', type(self), type(instance))
class Test:
x = Descriptor()
obj = Test()
obj.x
obj.x = 10
del obj.x
""" shell """
get... <class '__main__.Descriptor'> <class '__main__.Test'> <class 'type'>
set... <class '__main__.Descriptor'> <class '__main__.Test'> <class 'int'>
delete... <class '__main__.Descriptor'> <class '__main__.Test'>
容器类型
__len__(self, /) 定义当被 len() 调用时的行为(返回容器中元素的个数)
__getitem__(self, key, /) 定义获取容器中指定元素的行为,相当于 self[key]
__setitem__(self, key, value, /) 定义设置容器中指定元素的行为,相当于 self[key] = value
__delitem__(self, key, /) 定义删除容器中指定元素的行为,相当于 del self[key]
__iter__(self, /) 定义当迭代容器中的元素的行为
_reversed__(self) 定义当被 reversed() 调用时的行为
__contains__(self, item, /) 定义当使用成员测试运算符(in 或 not in)时的行为
如果希望定制的容器是不可变的话,只需定义__len__()和__getiltem__()方法
如果希望定制的容器是可变的话,还需要定义__setitem__()和__delitem__()方法
""" file """
class CountList:
def __init__(self, *args):
self.values = [x for x in args]
self.count = {}.fromkeys(range(len(self.values)), 0)
def __len__(self):
return len(self.values)
def __getitem__(self, key):
self.count[key] += 1
return self.values[key]
c1 = CountList(1, 3, 5, 7, 9)
c2 = CountList(2, 4, 6, 8, 10)
print(c1[2])
print(c2[2])
print(c1.count)
print(c2.count)
""" shell """
5
6
{0: 0, 1: 0, 2: 1, 3: 0, 4: 0}
{0: 0, 1: 0, 2: 1, 3: 0, 4: 0}