魔术方法介绍
以双下划线作为前缀和后缀的方法名是 Python 中特定使用的保留方法。例如, init 方法用于对象构造器,或者 call 方法用于使对象可调用。我们称这些方法为邓德方法,其中邓德指的是双 under(下划线)。这些邓德法又被称为魔法 -然而,并没有什么神奇的与之相关。Python 社区中有许多开发人员不太喜欢“魔法”这个词,因为它给人一种不鼓励使用这种方法的感觉,但矛盾是事实。
理解可调用函数
当对象在 call() 函数中定义时, Python 中的对象被称为可调用的。相同的功能可以定义为 x(arg 1,arg2,…) ,这是 x.call(arg1,arg 2,…) 的缩写。
注意:callable()方法返回一个布尔值,该值表示对象是否看起来是可调用的。如果对象是可调用的,此函数返回真;否则,它返回 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() 方法。
现在,让我们考虑另一个例子,我们将使用可调用()函数来检查对象是否可调用,然后将对象作为函数调用。
示例:
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() 函数,有不同类型的参数,有参数和关键字参数。因此,已成功调用了所需的对象。