Python __call__方法

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 = 0person_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__() 函数,带有不同类型的参数和参数和关键字参数。结果是,所需的对象已成功调用。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程