Code前端首页关于Code前端联系我们

Python 的 __call__() 方法

terry 2年前 (2023-09-29) 阅读数 64 #PHP
文章标签 PHP

魔术方法简介

前缀和后缀带有双连字符的方法名称是专门在 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前端网发表,如需转载,请注明页面地址。

热门