您的位置:首页 > 编程语言 > Python开发

Python基础教程——9魔法方法、属性及迭代器【总结】

2012-08-09 10:58 991 查看
1 旧式类和新式类

确保使用新式类:把__metaclass__=type放在模块的最开始【mataclass 元类】

或者

class MyClass(object):#子类化内建类object或者其他新式类

# do something

而使用旧式类:

class MyClass:

# do something

而在Python 3.0中没有旧式的类,也就不需要显式地子类化object或者将元类设置为type。所有的类都会隐式地成为object的子类——如果没有明确超类的话,就会直接子类化;否则就会间接子类化。

2归生成器和模拟生成器

递归生成器

def flatten(nested):

try:

try: nested + ''

except TypeError:pass

else: raise TypeError

for sublist in nested:

for element in flatten(sublist):

yield element

except TypeError:

yield nested

>>> list(flatten(['sdss',['sss',['fff']]]))

['sdss', 'sss', 'fff']

模拟生成器

>>> def flatten(nested):

result = []

try:

try: nested + ''

except TypeError:pass

else: raise TypeError

for sublist in nested:

for element in flatten(sublist):

result.append(element)

except TypeError:

result.append(nested)

return result

3 八皇后回溯

def conflict(state,nextX):

nextY = len(state)

for i in range(nextY):

if abs(state[i] - nextX) in (0, nextY - i):

return True

return False

def queens(num = 8, state = ()):

for pos in range(num):

if not conflict(state,pos):

if len(state) == num - 1:

yield (pos,)

else:

for result in queens(num,state+(pos,)):

yield (pos,) + result

def prettyprint(solution):

def line(pos,length = len(solution)):

return '. '*(pos) + 'X '+ '. '*(length-pos-1)

for pos in solution:

print line(pos)

import random

prettyprint(random.choice(list(queens(8))))

print list(queens(3))

print list(queens(4))

print len(list(queens(5)))

print len(list(queens(8)))

运行结果

>>>

. X . . . . . .

. . . . . X . .

. . . . . . . X

. . X . . . . .

X . . . . . . .

. . . X . . . .

. . . . . . X .

. . . . X . . .

[]

[(1, 3, 0, 2), (2, 0, 3, 1)]

10

92

4 第九章总结

1 旧式类和新式类:

为了创建新式类必须直接或者间接子类化object,或者设置__metaclass__属性为type

2 魔法方法:

在某种情况下会被Python自动调用,比如,__init__在对象被创建后立即自动调用

3 构造方法

这是面向对象语言的共有的,可能要为自己写的每个类实现构造方法。构造方法被命名为__init__并且在对象被创建后立即自动调用

4 重写

一个类能通过实现方法来重写他的超类中定义的这些方法和属性。如果新方法要调用重写版本的方法,可以从超类直接调用未绑定版本——超类名.__init(self)或者使用super函数——super(当前类,当前对象).__init__()

5 序列和映射

创建自己的序列或者映射需要实现所有的序列或者映射规则的方法,包括__getitem__和__setitem__这样的特殊方法。

通过子类化list和dict能节省很多工作

6迭代器:

迭代器是带有next方法的简单对象。迭代器能在一系列的值上进行迭代。当没有值可供迭代时,next方法就会引发StopIteration异常。

可迭代对象有一个返回迭代器的__iter__方法,它能像序列那样在for循环中使用。

一般来说,迭代器本身也是可迭代的,即迭代器有返回自己的next方法。

7 生成器

生成器函数包括了关键字yield的函数

当被调用时,生成器函数返回一个生成器——一种特殊的迭代器。可以使用send,throw,close方法让活动生成器和外界交互

8 八皇后问题

9 静态方法 和 类成员方法

静态方法:没有self参数,可以被类本身直接调用

类方法:需要cls参数,可以直接用类的具体参数调用
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: