python装饰器、面向对象、异步编程初接触

发布于 2022-02-16  484 次阅读


身为非专业学生,学校的通识课没有教decorator、OOP(Object Oriented Programming)、异步编程(Asynchronous Arogramming),近期愈发遇到代码读不懂的情况。。。为了彻底读懂自动平安复旦相关代码,以及最近需要批量下载很多音频和pdf数据(不用异步实在太慢),特此学习和笔记。

本人水平零蛋,欢迎大佬指正。加一句,菜鸟教程是个好东西(((

装饰器

其实就是将函数作为参数传给另一个函数,然后由从函数中返回函数,然后赋值给你定义的函数的函数名。用@语法糖,用在即将定义的函数前即可。

面向对象(OOP)

在python oop初级阶段,需要掌握的相关行话有:

  • 类(class):用来描述具有相同的属性和方法的对象的集合
  • 实例/对象(instance):这两个现阶段好像不用分太清,只要知道是由类实例化的一个实例
  • 方法(method):就是类里定义的函数,但有静态方法、类方法、实例方法之分,我的理解是简而言之不操作实例属性或者类公共属性的(不传递self形参的)就是静态方法,可以用@staticmethod装饰器
  • 类变量:定义在类中方法之外的变量,类以及实例化对象通用
  • 属性:实例的属性,用instance.property表示。赋值时常采用instance.property = value
  • 继承:所有类继承于Object类,类可以继承类,简单理解是你有的我全都有(继承),而你没有的我也可以有,你有的我还可以重写

先定义一个类,然后可以由类实例化为无数个对象需要深切理解类和实例的区别、类实例化的概念。外部也可以调用类中的方法,包括静态方法。静态方法其实可以不属于这个类(不传递self,和类和对象的属性都无关),只不过逻辑上属于类,便于理解和管理维护。

推荐阅读 菜鸟教程 python面向对象

异步编程

异步asynchronous,与synchronous相对

概念比较容易理解。就是遇到IO堵塞的时候先不管他,先处理其他事情。通过状态判断等到IO好了以后再回调继续执行。把各项异步任务注册到loop上,循环执行直到结束。

以下是实践中得到的经验和理解,不一定正确:

  • python中常用的是asyncio库,异步并发下载常用aiohttp库代替requests库。python异步文件IO常用aiofiles库。
  • 异步函数定义可以async def,而await关键字只能用在异步函数中。await后面一般跟可能阻塞的东西,比如网络IO(文件下载),文件IO等等。好像不必每处调用异步函数都await,只需要在会阻塞的地方await一次。
  • aiohttp库需要先实例化一个session。官方文档说尽量只实例化一个session,不要为每次请求都搞一个session。然鹅,翻遍了网上的资料,写法都是这样的:
async def download(url):
    async with aiohttp.ClientSession() as client:  #就是这里
    pass
for url in urls:
    tasks = []
    tasks.append(download(url))
  • 这不明显是实例化n个session?不过我改了半天也没改出来,在外部不用上下文管理器搞一个session就报错。而且我的下载需求比较特殊没办法用推导式,比较麻烦。
  • asyncio.run()在最后总是报RuntimeError: Event loop is closed参考https://blog.csdn.net/weixin_45787528/article/details/115450809,改成一般写法即可

异步一般用法:

异步函数初次调用好像会返回一个coroutine,把这些coroutine加到一个列表里,把他们asyncio.gather,貌似意思是注册到循环上,然后就可以run了,后续会给例子。