为什么我们在python中有可调用的对象?

时间:2010-03-12 23:39:43

标签: python callable

可调用对象的目的是什么?他们解决了什么问题?

3 个答案:

答案 0 :(得分:13)

Python中可以调用多种对象,它们可以用于多种用途:

  • 函数是可调用的,它们可以携带来自外部函数的“闭包”
  • 类是可调用的,调用类可以获得该类的实例
  • 方法是可调用的,用于类似于与实例
  • 相关的类似函数的行为
  • staticmethods和classmethods是可调用的,类似于方法的功能 功能在某种意义上属于“整个类”(staticmethods的用处是 可疑,因为一个班级方法也可以这样做; - )
  • 生成器是可调用的,调用生成器会获得一个迭代器对象
  • 最后,这可能是你所询问的具体内容(没有意识到这一点 所有这些都是对象...... !!!),你可以编写一个实例的类 callable:这通常是更新实例的调用的最简单方法 状态以及依赖它(虽然具有合适闭包的函数和约束 方法,提供替代方案,可调用实例是您需要时的一种方法 同时对同一个对象执行某些其他特定操作:for 例如,您希望能够调用的对象,但也应用索引更好 是一个可调用和可索引的类的实例; - )。

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)

可调用对象是一种适用于某些已知应用程序的工具,也可能对现实生活中的奇怪问题有所帮助。