当前位置: 首页 > news >正文

那些被渐渐遗忘的python知识点

文章目录

    • 前言
    • 1. 上下文管理器
    • 2. 类属性与实例属性
    • 3. __call__方法

前言

  正所谓:时运则存,不用则亡,这些有关python的知识点你还记得多少。

1. 上下文管理器

  无论是书籍还是博客,提到with就和读写文件联系在一起,之所以这么用是因为with相当于对 try...except...finally 模式进行了封装,即使文件读写有错误,也能保证资源的正确释放,渐渐地就认为with要和open()一起用,来读写文件。
  当然啦,with不仅仅用于读写文件,用作者的话说就是,with语句用于包装带有使用上下文管理器定义的方法的代码块的执行。例子如下:

with expr[ as var]:
	code_block 

  上述代码执行的顺序如下:

  1. 对上下文表达式进行求值来获得上下文管理器;
  2. 载入上下文管理器的 __enter__() 以便后续使用;
  3. 载入上下文管理器的 __exit__() 以便后续使用;
  4. 发起调用上下文管理器的 __enter__() 方法;
  5. 如果 with 语句中包含一个目标(as var),来自 __enter__() 的返回值将被赋值给它(var)
  6. 执行代码块;
  7. 发起调用上下文管理器的 __exit__() 方法。
  8. 如果代码块的退出是由异常导致的,则其类型、值和回溯信息将被作为参数传递给 __exit__(),否则的话,将提供三个 None 参数;
  9. 如果代码块的退出是由异常导致的,并且来自 __exit__() 方法的返回值为假,则该异常会被重新引发; 如果返回值为真,则该异常会被抑制,并会继续执行 with 语句之后的语句;
  10. 如果代码块由于异常以外的任何原因退出,则来自 __exit__() 的返回值会被忽略,并会在该类退出正常的发生位置继续执行。
  11. 如果在对目标列表赋值期间发生错误,则会将其视为在语句体内部发生的错误。

  含有__enter__()__exit__() 方法的对象称为上下文管理器。

class AClass(object):
    def __init__(self):
        self.count = 0

    def __enter__(self):
        print('先执行__enter__')
        self.count = 1
        return self

    def __exit__(self, exc_type, exc_value, traceback):
        print('退出时执行__exit__')


def afunc():
    return AClass()

if __name__ == '__main__':
	    with AClass() as f:
        print(f.count)
        print('这是code block')

    # with afunc():
    #     print('这是code block')
# 先执行__enter__
# 1
# 这是code block
# 退出时执行__exit__

  含有多个上下文管理器时可以这样使用with

# method 1
with A() as a, B() as b:
    code_block 

# method 2
with A() as a:
    with B() as b:
        code_block 
    
# method 3
with (
    A() as a,
    B() as b,
):
    code_block

2. 类属性与实例属性

  对于类对象,主要是加深一下对类属性与实例属性的认识,可以这样定义:
  类属性:定义在__init__()之外的属性;
  实例属性:定义在__init__()之内的属性,self.xxx=zzz
  虽然都是在类里面定义的,但也有些不同的用处,举个简单的栗子:

class A(object):
    count = 0

    def __init__(self):
        A.count += 1


if __name__ == '__main__':
    a1 = A()
    a2 = A()

    print(a1.count)
    print(a2.count)
# 2
# 2

  这里的count属性是类属性,即它和A是绑定在一起的,a1a2都是A的实例,它们俩共享count属性。

class A(object):
    count = 0

    def __init__(self):
        self.count += 1


if __name__ == '__main__':
    a1 = A()
    a2 = A()

    print(a1.count)
    print(a2.count)
# 1
# 1

  如果类属性和实例属性名称一样,从外部访问时,会得到实例属性而不是类属性,很好理解,类已经被实例化了。
  对于类变量,还可以这样使用,即调用类变量之前不需要实例化:

class A(object):
    count = 0

    def __init__(self):
        A.count += 1


if __name__ == '__main__':
    tmp_ = A()
    c = A.count
    print('current count is: ', c)
# current count is:  1

3. __call__方法

  __call__方法使得类实例对象可以像调用普通函数那样进行调用,类似于C++在类中对 () 运算符的重载:

class A(object):
    def __init__(self):
        pass

    def afunc(self):
        print('hi~')

    def __call__(self, *args, **kwargs):
        print('hi~, __call__')


if __name__ == '__main__':
    a = A()
    a.afunc()
    a()     # 会调用__call__方法
# hi~
# hi~, __call__

相关文章:

  • LeetCode16. 最接近的三数之和
  • 外包干了三年,真废了。。。
  • WinLicense 3.1.3.0 Crack
  • 通过Java监听MySQL数据的变化
  • Sam-ba烧录工具的使用教程
  • 基于驾驶训练优化算法的函数寻优算法
  • Linux运维面试题总结—Linux基础、计算机网络基础
  • ARM通用中断控制器GIC之中断处理
  • Vector简介说明
  • 图像处理黑科技——弯曲矫正、去摩尔纹、切边增强、PS检测
  • 大学网课查题接口
  • 【C语言】扫雷小游戏
  • 『Halcon与C#混合编程』011_工业相机的SDK介绍
  • 卷积核flip+transpose+cv.imread+enumerate+np.pad+tqdm
  • 【第一阶段:java基础】第1章:java概述
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • CAP理论的例子讲解
  • ES6简单总结(搭配简单的讲解和小案例)
  • iOS小技巧之UIImagePickerController实现头像选择
  • JS函数式编程 数组部分风格 ES6版
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • pdf文件如何在线转换为jpg图片
  • PHP那些事儿
  • vue脚手架vue-cli
  • windows-nginx-https-本地配置
  • 从重复到重用
  • 当SetTimeout遇到了字符串
  • 解析带emoji和链接的聊天系统消息
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (十一)图像的罗伯特梯度锐化
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (转)jQuery 基础
  • .bat批处理出现中文乱码的情况
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .NET Framework 服务实现监控可观测性最佳实践
  • .net对接阿里云CSB服务
  • .NET面试题解析(11)-SQL语言基础及数据库基本原理
  • 。Net下Windows服务程序开发疑惑
  • @zabbix数据库历史与趋势数据占用优化(mysql存储查询)
  • [ACTF2020 新生赛]Include
  • [android] 切换界面的通用处理
  • [codeforces] 25E Test || hash
  • [CSS3备忘] transform animation 等
  • [flume$2]记录一个写自定义Flume拦截器遇到的错误
  • [Geek Challenge 2023] web题解
  • [java]删除数组中的某一个元素
  • [JDK工具-2] javap 类文件解析工具-帮助理解class文件,了解Java编译器机制