Python教程-Python中的 call 方法
魔术方法简介
在Python中,以双下划线作为前缀和后缀的方法名称是特定用途的保留方法。例如,init方法用于对象构造函数,call方法用于使对象可调用。我们称这些方法为双下划线方法,其中双下划线指的是Double Under (Underscores)。这些双下划线方法也被称为魔术方法 - 但实际上并没有什么神奇之处。Python社区中有许多开发者不太喜欢“魔法”这个词,因为它给人一种使用这种方法是不鼓励的感觉,但实际上恰恰相反。
理解可调用函数
在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是否可调用,如果对象m可调用,则以无参数、仅有参数、使用call()函数、具有不同类型参数以及具有参数和关键字参数的方式调用对象。结果显示所需的对象已成功调用。