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))

posted @ 2012-05-17 22:07  Orcus  阅读(173)  评论(0编辑  收藏  举报