125 lines
4.4 KiB
Markdown
125 lines
4.4 KiB
Markdown
# Python 中的可调用对象
|
||
|
||
> 原文:<https://www.pythonforbeginners.com/basics/callable-objects-in-python>
|
||
|
||
你可能听说过 python 中的[函数是可调用对象。在本文中,我们将讨论术语“可调用对象”的确切含义。我们将讨论可调用对象实现背后的概念,并将实现程序来演示 python 中可调用对象的使用。](https://www.pythonforbeginners.com/basics/python-functions-cheat-sheet)
|
||
|
||
## 调用对象是什么意思?
|
||
|
||
我们通过在任何对象后面加上圆括号来称呼它们。例如,当我们必须调用一个函数时,我们在它们后面放上圆括号,如下所示。
|
||
|
||
```py
|
||
def add(num1, num2):
|
||
value = num1 + num2
|
||
return value
|
||
|
||
val = add(10, 20)
|
||
print("The sum of {} and {} is {}".format(10, 20, val))
|
||
```
|
||
|
||
输出:
|
||
|
||
```py
|
||
The sum of 10 and 20 is 30
|
||
```
|
||
|
||
这里,我们调用了 add()函数,将 10 和 20 作为输入参数。该函数在执行后返回输入数字的总和。
|
||
|
||
同理,我们也可以调用其他可调用对象。但是,如果我们调用一个不可调用的对象,python 解释器将抛出一个 TypeError 异常,并给出一条消息,说明该对象不可调用。这可以通过以下方式观察到。
|
||
|
||
```py
|
||
val = 10
|
||
val()
|
||
```
|
||
|
||
输出:
|
||
|
||
```py
|
||
Traceback (most recent call last):
|
||
File "/home/aditya1117/PycharmProjects/pythonProject/webscraping.py", line 2, in <module>
|
||
val()
|
||
TypeError: 'int' object is not callable
|
||
```
|
||
|
||
在这里,你可以看到我们已经定义了一个整型变量,然后我们调用了它。在执行时,它会引发 TypeError 异常,并显示一条消息,说明“int”对象不可调用。
|
||
|
||
调用一个函数可以,但是调用一个整型变量会引发异常,这是什么原因?让我们找出答案。
|
||
|
||
## Python 中什么是可调用对象?
|
||
|
||
python 中的可调用对象是这样一种对象,它在被调用时执行一些代码,而不是引发 TypeError。
|
||
|
||
每个可调用对象都在其类定义中实现了 __call__()方法。如果我们使用这个细节来定义可调用对象,那么 python 中的可调用对象就是那些在类定义中实现了 __call__()方法的对象。
|
||
|
||
如果对象在其类定义中没有 __call__()方法的实现,则每当调用该对象时,它都会引发 TypeError 异常。这可以从下面的例子中看出。
|
||
|
||
```py
|
||
class Website:
|
||
def __init__(self):
|
||
self.name = "Python For Beginners"
|
||
|
||
myWebsite = Website()
|
||
myWebsite()
|
||
```
|
||
|
||
输出:
|
||
|
||
```py
|
||
Traceback (most recent call last):
|
||
File "/home/aditya1117/PycharmProjects/pythonProject/webscraping.py", line 7, in <module>
|
||
myWebsite()
|
||
TypeError: 'Website' object is not callable
|
||
```
|
||
|
||
这里,对象 **myWebsite** 在其类 **Website** 的定义中没有 __call__()方法的实现。因此,它会引发 TypeError 异常,并显示一条消息,说明在调用“Website”对象时,它是不可调用的。
|
||
|
||
现在让我们在打印网站地址的**网站**类中实现 __call__()方法。观察这里的输出。
|
||
|
||
```py
|
||
class Website:
|
||
def __init__(self):
|
||
self.name = "Python For Beginners"
|
||
def __call__(self, *args, **kwargs):
|
||
print("Called me?")
|
||
print("I am available at pythonforbeginners.com")
|
||
|
||
myWebsite = Website()
|
||
myWebsite()
|
||
```
|
||
|
||
输出:
|
||
|
||
```py
|
||
Called me?
|
||
I am available at pythonforbeginners.com
|
||
```
|
||
|
||
现在,您可能很清楚,我们可以调用任何在其类定义中实现了 __call__()方法的对象。
|
||
|
||
## 如何在 python 中创建可调用对象?
|
||
|
||
我们在上面已经看到,所有可调用对象在它们的类定义中都有 __call__()方法的实现。因此,要在 python 中创建一个可调用的对象,我们将在对象的函数定义中实现 __call__()方法,如 abve 给出的示例所示。
|
||
|
||
```py
|
||
class Website:
|
||
def __init__(self):
|
||
self.name = "Python For Beginners"
|
||
|
||
def __call__(self, *args, **kwargs):
|
||
print("Called me?")
|
||
print("I am available at pythonforbeginners.com")
|
||
|
||
myWebsite = Website()
|
||
myWebsite()
|
||
```
|
||
|
||
输出:
|
||
|
||
```py
|
||
Called me?
|
||
I am available at pythonforbeginners.com
|
||
```
|
||
|
||
## 结论
|
||
|
||
在本文中,我们讨论了 python 中的可调用对象。我们还讨论了如何使用 __call__()方法创建可调用对象。要了解更多关于 python 编程的知识,你可以阅读这篇关于[列表理解](https://www.pythonforbeginners.com/basics/list-comprehensions-in-python)的文章。你可能也会喜欢这篇关于 Python 中[链表的文章。](https://www.pythonforbeginners.com/lists/linked-list-in-python) |