python高级语法(二) 装饰器和with上下文管理语句

本文探讨了Python中的装饰器和上下文管理器。装饰器简化了函数和方法的包装,如将函数转换为类方法或静态方法。上下文管理器通过with语句提供了一种确保执行清理代码的方式,即便在异常发生时也能正确关闭资源,如文件。文章通过实例展示了这两种语法的使用及其在代码可读性和维护性上的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


活动地址:优快云21天学习挑战赛

python高级语法(二)

装饰器

Python装饰器的作用是使函数包装与方法包装(一个函数,接受函数并返回其增强函数)变得更容易阅读和理解。最初的使用场景是在方法定义的开头能够将其定义为类方法或静态方法。如果不用装饰器语法的话,定义可能会非常稀疏,并且不断重复:

   class WithoutDecorators:
       def some_static_method():
           print("this is static method")
       some_static_method = staticmethod(some_static_method)
       def some_class_method(cls):
           print("this is class method")
       some_class_method = classmethod(some_class_method)

如果用装饰器语法重写的话,代码会更简短,也更容易理解:

   class WithDecorators:
       @staticmethod
       def some_static_method():
           print("this is static method")

       @classmethod
       def some_class_method(cls):
           print("this is class method")

1.一般语法和可能的实现

装饰器通常是一个命名的对象(不允许使用lambda表达式),在被(装饰函数)调用时接受单一参数,并返回另一个可调用对象。这里用的是“可调用(callable)”。而不是之前以为的“函数”。装饰器通常在方法和函数的范围内进行讨论,但它的适用范围并不局限于此。事实上,任何可调用对象(任何实现了 __call__方法的对象都是可调用的)都可以用作装饰器,它们返回的对象往往也不是简单的函数,而是实现了自己的__ call __方法的更复杂的类的实例。

装饰器语法只是语法糖而已。看下面这种装饰器用法:

   @some_decorator
   def decorated_function():
       pass

这种写法总是可以替换为显式的装饰器调用和函数的重新赋值:

   def decorated_function():
       pass
   decorated_function = some_decorator(decorated_function)

上下文管理器——with语句

为了确保即使在出现错误的情况下也能运行某些清理代码,try…finally语句是很有用的。这一语句有许多使用场景,例如:

  • 关闭一个文件。

  • 释放一个锁。

  • 创建一个临时的代码补丁。

  • 在特殊环境中运行受保护的代码。

with语句为这些使用场景下的代码块包装提供了一种简单方法。即使该代码块引发了异常,你也可以在其执行前后调用一些代码。例如,处理文件通常采用这种方式:

>>> hosts = open('/etc/hosts')
>>> try:
... for line in hosts:
... if line.startswith('#'):
... continue
... print(line.strip())
... finally:
... hosts.close()
...
127.0.0.1 localhost
255.255.255.255 broadcasthost
::1 localhost

利用with语句后可重写为

>>> with open('/etc/hosts') as hosts:
... for line in hosts:
... if line.startswith('#'):
... continue
... print(line.strip())
... 127.0.0.1 localhost
255.255.255.255 broadcasthost
::1 localhost

在前面的示例中,open的作用是上下文管理器,确保即使出现异常也要在执行完for循环之后关闭文件。

with语句的一般语法的最简单形式如下:

   with context_manager:
       # 代码块
       ...

此外,如果上下文管理器提供了上下文变量,可以用as子句保存为局部变量:

   with context_manager as context:
       # 代码块
       ...

注意,多个上下文管理器可以同时使用,如下所示:

   with A() as a, B() as b:
       ...

这种写法等价于嵌套使用,如下所示:

   with A() as a:
       with B() as b:
           ...

任何实现了上下文管理器协议(context manager protocol)的对象都可以用作上下文管理器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玉江仙。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值