魔法方法:开头和结尾都是两个下划线
特性(property)
迭代器(iterator)
1、构造函数
构造函数,即初始化方法,只是命名为__init__。
构造函数不同于普通方法的地方在于,将在对象创建后自动调用它们。
在Python中,创建构造函数很容易,只需将方法init的名称从普通的init改为魔法版__init__即可。
说明:在所有的Python魔法方法中,__init__是平常使用最多的。
扩展:Python提供了魔法方法__del__,也称作析构函数(destructor),这个方法在对象被销毁(作为垃圾被收集)前被调用。
1.1 重写普通方法和特殊的构造函数
重写构造函数时,必须调用超类(继承的类)的构造函数,否则可能无法正确的初始化对象。
有两种方法调用超类的构造函数:调用未关联的超类构造函数,以及使用函数super。
1.2 调用未关联的超类构造函数
对实例调用方式时,方法的参数self将自动关联到实例(称为关联的方法)
通过类调用方法(如Brid.__init__),没有实例与其相关联,称为未关联的方法。
通过将这个未关联方法的self参数设置为当前实例,即(如Brid.__init__(self)),达到使用超类的构造函数来初始化对象(如SongBrid)
1.3 使用super
2、元素访问
2.1 基本的序列和映射协议
序列和映射基本上是元素(item)的集合,要实现它们的基本行为(协议),不可变对象需要实现两个方法,而可变对象需要实现4个。
__len__(self):这个方法返回集合包含的项数,对序列来说为元素个数,对映射来说为键-值对数。如果__len__返回零,对象在布尔上下文中将被视为假。
__getitem__(self,key):这个方法返回与指定键相关联的值。对序列来说,键应该是0-n-1的整数(可以为负数),其中n为序列的长度,对映射来说,键可以是任何类型。
__setitem__(self,key,value):这个方法应以与键相关联的方式存储值,以便以后能够使用__getitem__来获取。当对象可变时,才需要实现这个方法。
__delitem__(self,key):这个方法在对对象的组成部分使用__del__语句时被调用,应删除与key相关联的值。当对象可变时,且允许其项被删除)时,才需要实现这方法。
2.2 从list、dict和str派生
CounterList类的行为在大多数方面都类似于列表,但它新增的counter属性,在当访问列表时,这个属性值都加1。
在标准库中,模块collections提供了抽象和具体的基类,但是也可以继承内置内型(list、dict和str)
3、特性
通过存取方法定义的属性通常称为特性(proprety)。
3.1 函数property
通过调用函数property并将存取方法作为参数(获取方法在前,设置方法在后)创建了一个特性,然后将名称size关联到这个特性。
调用函数property时,可不指定参数、指定一个参数、指定三个参数或指定四各参数。
如果没有指定任何参数,创建的特性将即不可读也不可写。
如果只指定一个参数(获取方法),创建的特性将是只读的。
第三个参数是可选的,指定用于删除属性的方法(这个方法不接受任何参数)。
第四个参数也是可选的,指定一个文档字符串。
参数分别名为fget、fset、fdel和doc。
说明:对于新式类,应使用特性而不是存取方法。
3.2 静态方法和类方法
静态方法和类方法创建:将它们分别包装在staticmethod和classmethod类的对象中。
静态方法的定义中没有参数self,可直接通过类来调用。
类方法的定义中包含类似于self的参数,通常被命名为cls,对于类方法,也可通过对象直接调用,但参数cls将自动关联到类。
装饰器可用于包装任何可调用的对象,并且可用于方法和函数。
可指定一个或多个装饰器,为此可在方法(或函数)前面使用运算符@列出这些装饰器(指定了多个装饰器时,应用的顺序与列出的顺序相反)。
3.3 __getattr__、__setattr__等方法
可以拦截对对象属性的所有访问企图,其用途之一是在旧式类中实现特性。
要在属性被访问时执行一段代码,必须使用一些魔法方法。
__getattribute__(self,name):在属性被访问时自动调用(只适合与新式类)
__getattr__(self,name):在属性被访问而对象没有这样的属性时自动调用
__setattr__(self,name,value):试图给属性赋值时自动调用
__delattr__(self,name):试图删除属性时自动调用
4、迭代器
4.1 迭代器协议
实现了方法__iter__的对象是可迭代的,而实现了方法__next__的对象是迭代器。
通过对可迭代对象调用内置函数iter,可获得一个迭代器。
4.2 从迭代器创建序列
5、生成器
生成器是一种使用普通函数语法定义的迭代器。
包含yield语句的函数都被称为生成器。
生成器不使用return返回一个值,而是可以生成多个值。
5.1 递归生成器
在调用flatten时,有两种可能:基线条件和递归条件。
5.2 通用生成器
生成器由两个单独的部分组成:生成器的函数和生成器的迭代器。
生成器的函数是由def语句定义的,其中包含yield。
生成器的迭代器是这个函数返回的结果。
5.3 生成器的方法
send :外部世界可通过这个方法访问生成器。
throw:用与在生成器中(yield表达式处)引发异常,调用时可提供一个异常类型、一个可选值和一个traceback对象。
close : 用于停止生成器,调用时无需提供任何参数。