【发布时间】:2011-01-27 01:15:56
【问题描述】:
可调用对象的目的是什么?他们解决了什么问题?
【问题讨论】:
可调用对象的目的是什么?他们解决了什么问题?
【问题讨论】:
在 Python 中可以调用多种对象,它们可以用于多种用途:
Python 的标准库提供了大量“他们解决的问题”的示例,其中包含我上面提到的每种特定类型的许多案例。
【讨论】:
它们接受参数并根据这些参数返回结果。
callable 只是函数的抽象形式,或定义对象像函数一样工作的接口(即接受参数)。
由于函数是第一类对象,很明显函数是可调用对象。如果您在谈论 __call__ 方法,这只是您可以重载自定义对象行为的众多特殊方法之一,例如用于算术运算或定义如果您调用一个对象会发生什么。
为什么要使用它的一个想法是让某种工厂对象本身创建其他对象。
【讨论】:
在某些区域,尤其是在“函数调用函数的函数”中,对象允许较少的嵌套。
考虑制作一个经典的装饰器,在调用函数之前检查授权级别。使用很清楚:
@check_authorization(level="Manager")
def update_price(Item, new_price):...
您可以将其作为嵌套函数来执行:
def check_authorization(level):
def take_params(function):
def concrete(*args, **kwargs):
if user_level_greater_than(level):
return function(*args,
**kwargs)
return None
return concrete
return take_params
或者你可以把它作为一个类,这可能更清楚:
class check_authorization(object):
def __init__(level):
self.level = level
def __call__(function):
self.function = function
return self.dec
def dec(self, *args, **kwargs):
if user_level_greater_than(self.level):
return self.function(*args,v**kwargs)
return None
许多人会发现这种扁平化方法更清晰。当然,我相信作弊,因为我喜欢正确的签名和元数据:
from dectools.dectools import make_call_if
@make_call_if
def check_authorization(function, arg, kwargs, level):
return user_level_greater_than(level)
可调用对象是一种适用于某些已知应用程序的工具,也可能适用于现实生活中遇到的奇怪问题。
【讨论】: