导航

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

Posted on 2012-08-09 10:58  immiki  阅读(235)  评论(0编辑  收藏  举报

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__并且在对象被创建后立即自动调用

重写

一个类能通过实现方法来重写他的超类中定义的这些方法和属性。如果新方法要调用重写版本的方法,可以从超类直接调用未绑定版本——超类名.__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参数,可以直接用类的具体参数调用