这是稍微高级一点的话题
1.首先来看看什么是闭包:
def sort(values, groups):
def helper(x):
if x in groups:
return (0, x)
return (1, x)
values.sort(key=helper)
这是一种定义在某种作用域的函数,python的函数是first-class object。
使用的时候,要注意变量作用域。python解释器遵循LEGB规则,会首先查找当前函数的作用域,任何外围作用域(比如这个闭包外面的函数)
,包含当前代码模块的作用域,内置作用域(也就是包含len,str的作用域)。
所以在闭包使用时,应该注意
def sort(values, groups):
found = False
def helper(x):
if x in groups:
found = True
return (0, x)
return (1, x)
values.sort(key=helper)
return found
内层函数对found的修改并不会影响到外层函数,因为这样可以防止函数中的局部变量污染函数外面的变量。
2.简单的接口应该接受函数,而不是类的实例
例如,在collections模块中有一个defaultdict类,它可以实现在一个字典里要是没有查到相应的key,就会使用某个函数为该键创建新值
import collections
def log():
print('add')
return 0
a = {'1':2}
b = [(3,4)]
res = collections.defaultdict(log, a)
print(res)
for key,values in b:
res[key]
print(res)
defaultdict(<function log at 0x00000268235911E0>, {'1': 2})
add
defaultdict(<function log at 0x00000268235911E0>, {3: 0, '1': 2})
这样的话,想想是不是会使得你的类更好的去测试。
3.不建议使用private属性
python认为后来者,会改进你所写的父类,但是如果你大量使用了private属性,后来者就不好改了。你应该在文档中说明每个所保护字段的含义,解释其意义,哪些东西不应该碰,这样的话后来者程序员就明白了。
4.简单描述下类的构建:
--__init__方法是两个下划线,它是用来初始化参数的,并且这个参数在整个实例里可以用和修改。
--你可以继承python的元类,做新的修改,但是不要如下继承:
class superList(list):
这实际上没有修改list这个内置方法
--类还有多态,mix-in等方法,不过就个人而言我更喜欢函数,而不是类。
--类还有更多的神奇方法,之前还准备稍微写下元类,后来想想,这个算是更加有难度了。
--补充下,装饰器和闭包都是用同一个字节码,你可理解装饰器就是先执行外部函数(相对于你所装饰的那个函数),再执行你所装饰的函数。