魔术方法简介

在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 = 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是否可调用,如果对象m可调用,则以无参数、仅有参数、使用call()函数、具有不同类型参数以及具有参数和关键字参数的方式调用对象。结果显示所需的对象已成功调用。

标签: Tkinter教程, Tkinter安装, Tkinter库, Tkinter入门, Tkinter学习, Tkinter入门教程, Tkinter, Tkinter进阶, Tkinter指南, Tkinter学习指南, Tkinter进阶教程, Tkinter编程