Python 的 __call__() 方法
魔术方法简介
前缀和后缀带有双连字符的方法名称是专门在 Python 中使用的保留方法。例如,方法 init 用于对象构造函数,或者方法 call 用于使对象可调用。我们将这些方法称为 Dunder 方法,其中 Dunder 指的是双下划线(下划线)。这些邓德法则也被称为魔法——但它们并没有什么魔法。 Python 社区中有很多开发人员不喜欢“魔法”这个词,因为它似乎不鼓励使用这种方法,但事实恰恰相反。
了解可调用函数
在Python中,如果一个对象在函数call()中定义,则该对象被称为可调用的。同样的函数可以定义为 x(arg 1, arg2,…) ,它是 x.call(arg1, arg 2,…) 的缩写。
注意。 callable() 方法返回一个布尔值,指示该对象是否可调用。如果对象可调用,则该函数返回 True;否则返回 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() 函数检查该类及其对象是否可调用。
让我们看一下调用 __() 函数 的示例。
示例:
# 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="">
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() 函数有不同类型的参数,包括参数和关键字参数。因此,所需要的对象已经被成功调用。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
code前端网