python-基础知识

记录Python的基础知识

鸭子模型

描述:当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。
在鸭子类型中,关注的不是对象的类型本身,而是它是如何使用的。例如,在不使用鸭子类型的语言中,我们可以编写一个函数,它接受一个类型为鸭的对象,并调用它的走和叫方法。在使用鸭子类型的语言中,这样的一个函数可以接受一个任意类型的对象,并调用它的走和叫方法。如果这些需要被调用的方法不存在,那么将引发一个运行时错误。任何拥有这样的正确的走和叫方法的对象都可被函数接受的这种行为引出了以上表述,这种决定类型的方式因此得名。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def test(arg):
print arg.prt()
class A(object):
def prt():
print 'AAA'
class B(object):
pass
a = A()
b = B()
test(a)
test(b)

test(a) 会正常输出,test(b) 会报错。函数test接收一个对象参数arg,这个对象参数有一个prt方法。我们并不关心对象参数arg是什么对象,只关心它有没有prt函数,这就是鸭子模型

thread与threading差异

  1. threading 有更好的线程支持,并且 thread 模块中的一些属性会 和 threading 模块有冲突。
  2. thread 模块拥有的同步原语很少(实际只有一个),而threading模块则由很多。
  3. thread 模块对于线程何时退出没有控制。当主线程结束时,所有其他线程也都强制结束,不会发出警告或进行适当清理。

python 多进程与多线程使用

由于Python 的 GIL 的限制,多线程更适合I/O密集型应用(I/O释放了GIL,可以允许更多的并发),而不是计算密集型应用。对于计算密集型应用,为了实现更好的并发性,则需要使用多进程以便让CPU的其他内核来执行。