代码改变世界

类定义

2011-11-29 18:42  夜幕降临  阅读(292)  评论(0编辑  收藏  举报

Python 是完全面向对象的:你可以定义自己的类,从你自己或

系统自带的类继承,并生成实例。
class PapayaWhip:
pass


class Fib:
'''iterator that yields numbers in the Fibonacci sequence'''

def __init__(self, max):
self.max = max

def __iter__(self):
self.a = 0
self.b = 1
return self

def __next__(self):
fib = self.a
if fib > self.max:
raise StopIteration
self.a, self.b = self.b, self.a + self.b
return fib

__INIT__() 方法
类实例创建后,__init__() 方法被立即调用
每个方法的第一个参数,包括 __init__() 方法,永远指向当前的类象。 习惯上,该参数叫 self。

每个类实例具有一个内建属性, __class__, 它是该对象的类。
Python 里面, 和调用函数一样简单的调用一个类来创建该类的新实例
fib = fibonacci2.Fib(100)

实例变量
self.max 是实例变量,在实例范围内都可以访问

迭代器
迭代器就是一个定义了 __iter__() 方法的类。
调用 iter(fib)的时候,__iter__()就会被调用
在迭代器的实例中调用 next()方法时,__next__() 会自动调用
当 __next__() 方法抛出 StopIteration 异常, 这是给调用者
表示迭代用完了的信号。 和大多数异常不同, 这不是错误;它
是正常情况,仅表示迭代器没有值可产生了。

iter(f) 调用 f.__iter__
next(f) 调用 f.__next__


类变量是类的所有实例共享的,定义时前面不用加上self
可以使用特殊的 __class__ 属性来访问类属性(于此相对的是单独实例的属性)
r2.rules_filename = 'r2‐override.txt' #修改实例属性,覆盖了类的属性
r2.__class__.rules_filename = 'papayawhip.txt'
这样将会影响所有的类,但是已经覆盖了该属性的类不会受影响,所以r2的rules_filenames不会改变

写模块的目标
最小化初始代价。 在 import 时发生的唯一的事就是实例化
一个单一的类并打开一个文件(但并不读取)。

最大化性能 前述示例会在每次你想让一个单词变复数时,读
遍文件并动态创建功能。本版本将在创建的同时缓存功能,在
最坏情况下,仅需要读完一遍文件,无论你要让多少单词变复
数。

将代码和数据分离。 所有模式被存在一个分开的文件。代码
是代码,数据是数据,二者永远不会交织。