Python 教程阅读笔记(八):类
Python中的类提供了面向对象编程的所有标准特性:类继承机制允许有多个基类,派生类可以覆写基类的所有方法,其方法可以调用基类的方法。类在运行时创建,可在创建后进一步修改。
namespace 是一种从名字到对象的映射。大多数命令空间都实现为字典。不同的命名空间的名字没有半根毛的关系
可写的属性可由del语句删除
命名空间在不同的时间创建,有不同的生命周期。包含内置的名字的命名空间在解释器启动时就创建了,而且不会被删除。模块的全局命令空间在模块定义被读入时创建,被认为是__main__模块的一部分,内置的名字实际上也存在模块中,模块名为builtins
函数的局部命名空间在函数被调用时创建,在函数返回或抛出异常且没在函数被处理时被删除。递归调用都由自己的局部命名空间
域是命名空间可直接访问的文本区域。直接存取意味着不需要对名字加啥限定就可直接使用
所有引入新名字的操作都使用局部域:如import语句,函数定义
global 语句用来指示特定的变量作用于全局域,应该绑定到这里
nonlocal 语句用来指示特定的变量作用于闭包域,应该绑定到这里
class ClassName:
<statement-1>
.
.
.
<statement-N>
当一个类的定义结束后,一个类对象将被创建
属性引用采用标准的语法:obj.name
类实例化采用函数的符号,可以假装类对象是个无参的函数,返回一个类的新实例
很多类在创建对象时需要特殊的初始化状态
def __init__(self):
self.data = []
类定义的时候没有参数,但在实例化时可以有参数,这些参数可以在__init__中使用
数据属性不需要申明,跟局部变量类似,在第一次赋值时诞生。而方法属性必须是申明过的。
obj.method() 等价于 class.method(obj)
数据属性命名如果和方法属性一样,会覆写方法属性。数据属性和方法属性需满足一定的编程规范。
继承采用下面的格式:
class DerivedClassName(BaseClassName): #modname.BaseClassName
<statement-1>
.
.
.
<statement-N>
如果想直接调用基类的方法
BaseClassName.methodname(self, arguments)
isinstance()、issubclass() 是两个内置的函数用来处理继承的。
多重继承时,搜索顺序为先深度搜索,再从左到右,而且若类在层级上有重叠时不会重复搜索两次
名字改编在让子类覆写方法而不打破内部的方法调用时是有用的。 至少两个前缀下滑线,至多一个后缀下滑线,如__spam,会被替换为_classname__spam
如果需要像C语言的结构体的数据类型,可用空类实现
异常也是一个类
for语句的实现,iter()返回一个迭代对象,__next__()函数从容器中一次取一个元素。当没有元素时,会抛出一个StopIteration异常
因此想要类可迭代,就需要实现__iter__()和 __next__()两个方法
可用生成器来实现迭代,以避免实现__iter__()和__next__()两个方法,方法是在返回时使用yield。生成器会自动进行方法创建并保存程序状态,当生成器终止时,会自动抛出StopIteration
生成器表达式:一些简单的生成器可以简洁的编码为表达式,使用的语法可列表速购类似,除了使用括号而不是方括号
sum(i*i for i in range(10))