python必知必会8

作者: Nefelibatas | 来源:发表于2022-03-07 10:27 被阅读0次

    什么是闭包?

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

    相关文章

      网友评论

        本文标题:python必知必会8

        本文链接:https://www.haomeiwen.com/subject/unggrrtx.html