__init__(self[, ...])需要参数,重写传入不能返回其他,只能返回None
__new__(cls[, ...])当继承一个不可变类型,但又需要进行修改返回实例化的对象 class CapStr(str): def __new__(cls, string): string = string.upper() return str.__new__(cls, string)
__del__(self)所有引用都被del之后才触发
__add__(self, other)__sub__(self, other) class Try_int(int): def __add__(self, other): return int(self) + int(other) a = Try_int(3) b = Try_int(5) a + b
__rsub__(self, other) class Nint(int): def __rsub__(self, other): return int.__sub__(other, self) a = Nint(5) 3 - a
__str__(self)被打印,需要字符串输出的时候被调用__repr__直接输出实例对象的时候被调用
__getattr__(self, name)定义当用户试图获取一个不存在的属性时的行为__getattribute__(self, name)定义当该类的属性被访问时的行为__setattr__(self, name, value)定义当一个属性被设置时的行为__delattr__(self, name)定义当一个属性被删除时的行为 class Rectangle: def __init__(self, width=0, height=0): self.width = width self.height = height def __setattr__(self, name, value): if name == 'square': self.width = value self.height = value else: self.__dict__[name] = value #或者 super().__setattr__(name, value) #错误 self.name = value def getArea(self): return self.width * self.height
描述符将某种特殊类型的类的实例指派给另一个类的属性__get__(self, instance, owner)用于访问属性,它返回属性的值__set__(self, instance, value)将在属性分配操作中调用,不返回任何内容__delete__(self, instance)控制删除操作,不返回任何内容 class MyProperty: def __init__(self, fget=None, fset=None, fdel=None): self.fget = fget self.fset = fset self.fdel = fdel def __get__(self, instance, owner): return self.fget(instance) def __set__(self, instance, value): self.fset(instance, value) def __delete__(self, instance): self.fdel(instance)
容器类型的协议定制的容器不可变,需要定义__len__()和__getitem__()方法定制的容器可变,还需要定义__setitem__()和__delitem__()方法__len__(self) 定义当被被len()调用时的行为,返回容器中元素的个数__getitsem__(self, key) 定义获取容器中指定元素的行为,相当于self[key]__setitem__(self, key, value) 定义设置容器中指定元素的行为,相当于self[key] = value__delitem__(self, key) 定义删除容器中指定元素的行为
迭代器,迭代方法的容器iter() 产生迭代器,参数是容器next() 调用迭代器,参数是迭代器
生成器,特殊迭代器yield 暂停返回a = [i for i in range(100) if not(i % 2) and (i % 3)]b = {i:i % 2 == 0 for i in range(10)}