活动地址:优快云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)的对象都可以用作上下文管理器。