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

    什么是闭包? 实现闭包的要素是哪些?闭包中的自由变量的绑定?nonlocal 的使用? 在一个内部函数中,对外部作...

  • 一些课程或书

    Excel 数据库《MySQL必知必会》 Python《Python Cookbook》《Web scraping...

  • 优秀参考文章--性能优化

    Android 性能优化必知必会Android 性能优化必知必会

  • python必知必会1

    新篇章系列开启,围绕两个部分,一是python编程基础与特性,二是数据结构与算法。 Q:列表和元组之间的区别是什么...

  • python必知必会9

    生成器和迭代器 迭代是处理数据的重要环节,基本上对大量数据的处理上,我们都需要对数据进行迭代操作,如何在节省内存开...

  • python必知必会3

    如何求两个列表的交集、差集、并集? 求交集: list(set(a) & set(b))求差集: list(set...

  • python必知必会5

    Python 的 super 方法有什么用? 面向对象编程的主要优点之一是重用。继承是实现继承的机制之一。 在继承...

  • python必知必会4

    解释一下 python 中 pass 语句的作用 pass是一个空操作。当它被执行时,什么都不发生。它适合当语法上...

  • python必知必会11

    Python 里面如何拷贝一个对象? 直接赋值:其实就是对象的引用(别名)。 浅拷贝 (shallow copy)...

  • python必知必会12

    Python 的内存机制 内存机制主要包括垃圾收集和内存管理两部分。Python 主要使用基于引用计数的垃圾回收机...

网友评论

    本文标题:python必知必会8

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