python必知必会8
什么是闭包?
实现闭包的要素是哪些?
闭包中的自由变量的绑定?
nonlocal 的使用?
在一个内部函数中,对外部作用域的变量进行引用,(并且一般外部函数的返回值为内部函数),那么内部函数就被认为是闭包。简而言之,闭包指延伸作用域的函数。
闭包有两个要素:
- 嵌套在另一个函数中的函数
- 自由变量的引用
装饰器的用法是什么?
装饰器句法
装饰器的本质
Python 何时载入装饰器,何时运行?
一个装饰器(decorator)就是一个函数,它接受一个函数作为参数并返回一个新的函数。
基本用法:
@decorator
def func(*args, **kwargs):
...
等价于:
def func(*args, **kwargs):
...
func = decorator(func) # func是一个函数对象,只有加了()才是真正调用这个方法
使用装饰器是元编程技术的一种。它是关于创建操作源代码的函数和类,在运行时去改变程序的行为。这也是 clean code 的守则之一:不要做重复的事情(Don’t repeat yourself)。而装饰器就是给一个函数增加额外的操作,并且可以被复用。
Python 中,@符号就是表示装饰器的语法糖。
装饰器的本质就是,它是一个可调用的对象(通常都是指函数),它的参数是另外一个函数。
具有call()方法的对象都是可调用对象。
hasattr() getattr() setattr() 的用法
hasattr(object, name):判断一个对象里面是否有 name 属性或者 name 方法,返回布尔值,有name特性返回True, 否则返回False。
getattr(object, name[,default]):获取对象 object 的属性或者方法,如果存在返回该属性值,如果不存在,返回默认值。默认值可选。如果没有设置默认值,且属性不存在会抛出AttributieError。
setattr(object, name, values):给对象的属性赋值,若属性不存在,先创建再赋值。
hasattr的实现方法其实是先调用getattr,看看是否抛出AttributieError,抛出则返回False,不抛出则返回True。
如何实现Python函数重载?
Python 重载机制: 转发(Dispatch),即通过使用单分派函数functools.singledispatch来实现函数重载。
函数重载,就是指 函数名字相同但参数类型或个数不同时执行不同的函数。目前为止,Python 本身是不支持重载的,只有使用functools这个库的singledispatch才可以间接实现。
使用单分派函数实现函数重载,主要有两个关键点:
使用@singledispatch装饰器标记处理基函数
使用@<<base_function>>.register(<<type>>)装饰各个专门的函数
@singledispatch
def to_str(obj):
print('%r'%(obj))
# to_str是上面标记的基函数,函数参数类型是作为register的参数传入,从而实现重载
@to_str.register(int)
def _(obj): # 专门函数的名称无关紧要,所以使用`_`这个占位符即可。并且切记不要和基函数名字一样,否则会覆盖。
print('Integer: %d'%(obj))
@to_str.register(str)
def _(obj):
print('String: %s'%(obj))
@to_str.register(list)
def _(obj):
print('List: %r'%(obj))
if __name__ == "__main__":
to_str(1)
to_str('hello')
to_str(range(3))
to_str(object)