11.AOP和装饰器(可参考stackoverflow或者个人博客)
装饰器的作用就是为已经存在的对象添加额外的功能。
https://blog.csdn.net/honorwh/article/details/89381587
12.鸭子类型:
简单来说,就是不管对象是什么类型,而只关心对象的行为。
鸭子类型在动态语言中经常使用,非常灵活,使得python不想java那样专门去弄一大堆的设计模式。
13.python中重载?
函数重载主要是为了解决两个问题:
一个是可变参数类型,一个是可变参数个数。
一个基本的设计原则是,仅仅当两个函数除了参数类型和参数个数不同以外,其功能是完全相同的,此时才使用函数重载,如果两个函数的功能其实不同,那么不应当使用重载,而应当使用一个名字不同的函数。
那么对于情况 1 ,函数功能相同,但是参数类型不同,python 如何处理?答案是根本不需要处理,因为 python 可以接受任何类型的参数,如果函数的功能相同,那么不同的参数类型在 python 中很可能是相同的代码,没有必要做成两个不同函数。
那么对于情况 2 ,函数功能相同,但参数个数不同,python 如何处理?大家知道,答案就是缺省参数(用*args可以解决)。对那些缺少的参数设定为缺省参数即可解决问题。因为你假设函数功能相同,那么那些缺少的参数终归是需要用的。
所以,python 自然就不需要函数重载了。
14.新式类和旧式类
python2有经典类和新式类并存,具体写法分为:
class A(object):新式类
class A():旧式类
class A:旧式类
python3默认是新式类
有无object是判断旧式类和新式类的最大区别。
新式类的MRO(method resolution order 基类搜索顺序)算法采用C3算法广度优先搜索,而旧式类的MRO算法是采用深度优先搜索。
在python2和python3定义类,测试他的类型时是这样:
Python2
class A:
pass
print(type(A))
output:
Python3
class A(object):
pass
print(type(A))
output:
另外旧式类的深度优先示例:
class A():
def foo1(self):
print("A")
class B(A):
def foo2(self):
pass
class C(A):
def foo1(self):
print("C")
class D(B, C):
pass
d =D()
d.foo1()
output:
A
按照经典类的查找顺序从左到右深度优先
的规则,在访问d.foo1()
的时候,D这个类是没有的..那么往上查找,先找到B,里面没有,深度优先,访问A,找到了foo1(),所以这时候调用的是A的foo1(),从而导致C重写的foo1()被绕过
新式类是广度优先
class A(object):
def foo1(self):
print("A")
class B(object):
def foo2(self):
pass
class C(object): #或者是class C(A):只要A是新式类的定义,那么继承类都是新式类
def foo1(self):
print("C")
class D(B, C):
pass
d = D()
d.foo1()
output:
C
15.__new__和__init__的区别:
需要控制新实例的创建时,请使用__new__。需要控制新实例的初始化时,请使用 __init__。
__new__是实例创建的第一步。它首先被调用,并负责返回您的类的新实例。相比之下, __ init__不会返回任何内容; 它只负责在创建实例后初始化它。
通常,除非您继承了str,int,unicode或tuple之类的不可变类型,否则不应该覆盖__new__。
16.单例模式
https://blog.csdn.net/honorwh/article/details/89882762
17.python的作用域
Python 中,一个变量的作用域总是由在代码中被赋值的地方所决定的。
当 Python 遇到一个变量的话他会按照这样的顺序进行搜索:
本地作用域(Local)→当前作用域被嵌入的本地作用域(Enclosing locals)→全局/模块作用域(Global)→内置作用域(Built-in)
简称LEGB
18.GIL线程全局锁
线程全局锁(Global Interpreter Lock),即Python为了保证线程安全而采取的独立线程运行的限制,说白了就是一个核只能在同一时间运行一个线程.对于io密集型任务,python的多线程起到作用,但对于cpu密集型任务,python的多线程几乎占不到任何优势,还有可能因为争夺资源而变慢。
解决办法就是多进程和下面的协程(协程也只是单CPU,但是能减小切换代价提升性能).
这也不是一两句说得明白的,后续会专门写一篇学习。
19.协程
后续会专门写一篇学习线程、进程和协程的区别
20.闭包
闭包(closure)是函数式编程的重要的语法结构。闭包也是一种组织代码的结构,它同样提高了代码的可重复使用性。
当一个内嵌函数引用其外部作作用域的变量,我们就会得到一个闭包. 总结一下,创建一个闭包必须满足以下几点:
I.必须有一个内嵌函数
II.内嵌函数必须引用外部函数中的变量
III.外部函数的返回值必须是内嵌函数
举例说明:
def ExFunc(n):
sum = n
def InsFunc():
return sum + 1
return InsFunc
闭包就像个空心球一样,你知道外面和里面,但你不知道中间是什么样.