1 旧式类和新式类
确保使用新式类:把__metaclass__=type放在模块的最开始【mataclass 元类】
或者
class MyClass(object):#子类化内建类object或者其他新式类
# do something
而使用旧式类:
class MyClass:
# do something
而在Python 3.0中没有旧式的类,也就不需要显式地子类化object或者将元类设置为type。所有的类都会隐式地成为object的子类——如果没有明确超类的话,就会直接子类化;否则就会间接子类化。
递归生成器
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
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参数,可以直接用类的具体参数调用