可调用对象的目的是什么?他们解决了什么问题?
答案 0 :(得分:13)
Python中可以调用多种对象,它们可以用于多种用途:
Python的标准库提供了大量的“他们解决的问题”的例子,其中包含了我上面提到的每种特定类型的许多案例。
答案 1 :(得分:9)
它们接受参数并根据这些参数返回结果。
callable 只是函数的抽象形式,是一个接口,它定义一个对象就像一个函数(即接受参数)。
由于函数是第一类对象,很明显函数是可调用对象。如果您正在讨论__call__
方法,这只是众多特殊方法中的一种,您可以使用这些方法重载自定义对象的行为,例如:用于算术运算或定义如果调用对象会发生什么。
为什么要使用这种方法的一个想法是让某种工厂对象本身创建其他对象。
答案 2 :(得分:2)
有些区域,特别是在'函数调用函数函数的函数'中,对象允许更少的嵌套。
考虑制作一个经典装饰器,在调用函数之前检查授权级别。使用它很清楚:
@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)
可调用对象是一种适用于某些已知应用程序的工具,也可能对现实生活中的奇怪问题有所帮助。