PythonPython必知必会系列

python必知必会8

2022-03-07  本文已影响0人  Nefelibatas

什么是闭包?

实现闭包的要素是哪些?
闭包中的自由变量的绑定?
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)
上一篇下一篇

猜你喜欢

热点阅读