geekdoc-python-zh/docs/py4b/callable-objects-in-python.md

125 lines
4.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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)