Python __call__
方法
神奇方法的介绍
以双下划线作为前缀和后缀的方法名是Python中专门用于特定用途的保留方法。例如, __init__
方法用于对象的构造函数, __call__
方法用于使对象可调用。我们将这些方法称为 dunder方法 ,其中 dunder 代表 双下划线 。这些 dunder方法 也被称为 神奇方法 - 尽管实际上与魔术无关。Python社区中有很多开发人员对于“魔术”这个词不太感兴趣,因为它给人一种使用这种方法是不鼓励的感觉,但实际上情况正好相反。
理解可调用函数
当对象在 __call__() 函数内被定义时,该对象称为可调用对象。函数可以定义为 x(arg1, arg2, …) ,这相当于 x.__call__(arg1, arg2, …)
。
注意:callable()方法返回对象是否可调用的布尔值。如果对象是可调用的,则返回True;反之,返回False。此外,即使对象不可调用,该方法可能仍然返回True。但是,如果该方法返回False,则对象不可调用。
此外,Python类始终是可调用的。因此,我们可以始终将 callable() 函数与类的对象一起使用,而不是类本身。
让我们考虑以下示例以了解Python callable() 函数的行为。
示例:
# creating a class
class Employee:
n = 0
# defining a function
def __init__(self, emp_id):
self.i = emp_id
# instantiating the class
x = Employee(15)
# checking if the class and object are callable or not
print('Employee Class is callable = ', callable(Employee))
print('Employee object is callable = ',
输出:
Employee Class is callable = True
Employee object is callable = False
解释:
在上面的示例中,我们定义了一个名为 Employee 的类,它接受一个变量 n = 0 。然后我们定义了一个函数并实例化了这个类。最后,我们使用 callable() 函数检查这个类及其对象是否可调用。
让我们看一个 __call__()
函数的示例。
示例:
# creating Person Class
class Person:
person_id = 0
person_name = ""
# defining an initializing function
def __init__(self, personid, personname):
self.person_id = personid
self.person_name = personname
# defining a callable function
def __call__(self, *args, **kwargs):
print('Printing Arguments')
print(*args)
print('Printing Keyword Arguments')
for key, value in kwargs.items():
print("%s == %s" % (key, value))
# instantiating the class
m = Person(15, 'George')
# printing the object
print(m)
# checking if the object is callable or not
print("The Person object is callable: ", callable
输出:
<__main__.Person object at 0x000002706DF41FD0>
The Person object is callable: True
解释:
在上面的示例中,我们定义了 Person 类和变量 person_id = 0 和 person_name = ” “ 。然后我们定义了初始化函数和可调用函数。最后,我们实例化了该类,打印了对象,并检查了对象是否可调用。结果是,person对象可调用。
此外,我们可以观察到我们使用 *args
允许传递可变参数和 **kwargs
允许传递命名参数给 __call__()
方法。
现在,让我们看另一个示例,在这个示例中,我们将使用 callable() 函数来检查对象是否可调用,并将对象作为函数调用。
示例:
if callable(m):
m()
m(15, 30)
m.__call__(15, 30)
m(15, 30, {'a': 4, 'b': 8})
m(15, 'B', personname = 'George', personid = 50)
输出:
Printing Arguments
Printing Keyword Arguments
Printing Arguments
15 30
Printing Keyword Arguments
Printing Arguments
15 30
Printing Keyword Arguments
Printing Arguments
15 30 {'a': 4, 'b': 8}
Printing Keyword Arguments
Printing Arguments
15 B
Printing Keyword Arguments
personname == George
personid == 50
说明:
在上面的示例中,我们定义了一个 if 语句,其中如果对象m是可调用的,则将对象作为一个无参数的函数调用,只带有参数,带有 __call__()
函数,带有不同类型的参数和参数和关键字参数。结果是,所需的对象已成功调用。