Python callable()和__call __()

时间:2020-02-23 14:42:29  来源:igfitidea点击:

如果对象看起来可调用,Python callable(object)函数将返回True,否则返回False。

Python可调用和__call __()

如果Python对象定义了__call __()函数,则称为可调用对象。
如果定义了此函数,则x(arg1,arg2,…)x .__ call __(arg1,arg2,…)的简写。

请注意,如果对象显示为可调用,则callable()函数将返回True,即使该对象不可调用,也有可能返回True。
但是,如果此函数返回False,则该对象绝对不可调用。

此外,python类始终是可调用的。
因此,请始终对类的实例(而不是类本身)使用callable()。
让我们看一个简单的例子来检查这种行为。

class Person:
  i = 0

  def __init__(self, id):
      self.i = id

p = Person(10)
print('Person Class is callable = ', callable(Person))
print('Person object is callable = ', callable(p))

输出:

Person Class is callable =  True
Person object is callable =  False

Python callable()和__call __()示例

让我们用__call __()函数定义一个类。

class Employee:
  id = 0
  name = ""

  def __init__(self, i, n):
      self.id = i
      self.name = n

  def __call__(self, *args, **kwargs):
      print('printing args')
      print(*args)

      print('printing kwargs')
      for key, value in kwargs.items():
          print("%s == %s" % (key, value))

e = Employee(10, 'hyman')  # creating object

print(e)  # printing object

print(callable(e))
  • args用于允许将变量参数传递给__call __()函数。

** kwargs用于允许将命名参数传递给__call __()函数。

输出:

<__main__.Employee object at 0x107e9e1d0>
True

让我们看一些代码片段,在这些片段中,我们将使用callable()来检查对象是否可调用,然后将其作为函数调用。

if callable(e):
  e()  # object called as a function, no arguments

  e(10, 20)  # only args
  e.__call__(10, 20)

  e(10, 20, {'x': 1, 'y': 2})  # only args of different types

  e(10, 'A', name='hyman', id=20)  # args and kwargs both

输出:

printing args

printing kwargs
printing args
10 20
printing kwargs
printing args
10 20
printing kwargs
printing args
10 20 {'x': 1, 'y': 2}
printing kwargs
printing args
10 A
printing kwargs
name == hyman
id == 20