类型错误:'模块'对象不可调用

810 投票
17 回答
2202751 浏览
提问于 2025-04-16 09:03
File "C:\Users\Administrator\Documents\Mibot\oops\blinkserv.py", line 82, in __init__
    self.serv = socket(AF_INET,SOCK_STREAM)
TypeError: 'module' object is not callable

我为什么会出现这个错误?我有点困惑。

我该怎么解决这个错误呢?

17 个回答

135

在你的类的父目录下,找到主要的 __init__.py 文件,然后添加一些内容,比如:

from .YourClass import YourClass

这样一来,当你在其他脚本中导入这个类时,就会有一个类的实例可以直接使用了:

from YourClassParentDir import YourClass
341

假设YourClass.py的内容是:

class YourClass:
    # ......

如果你使用:

from YourClassParentDir import YourClass  # means YourClass.py

这样的话,当你尝试调用YourClass()时,会出现类型错误:'模块'对象不可调用的错误。

但是,如果你使用:

from YourClassParentDir.YourClass import YourClass   # means Class YourClass

或者使用YourClass.YourClass(),那就可以正常工作了。

810

socket 是一个模块,里面包含了一个叫 socket 的类。

你需要使用 socket.socket(...) 或者 from socket import socket 来使用它:

>>> import socket
>>> socket
<module 'socket' from 'C:\Python27\lib\socket.pyc'>
>>> socket.socket
<class 'socket._socketobject'>
>>>
>>> from socket import socket
>>> socket
<class 'socket._socketobject'>

这个错误信息的意思是:
它说 module object is not callable,因为你的代码试图调用一个 模块 对象。模块对象是你导入模块时得到的东西。你想做的其实是调用模块里面的一个 对象,而这个类的名字恰好和模块的名字是一样的。

下面是一个分析这种错误的逻辑方法:

  • "module object is not callable。Python 在告诉我我的代码试图调用一个不能被调用的东西。我的代码到底在试图调用什么?"
  • "代码试图调用 socket。这应该是可以调用的!变量 socket 是我想的那个吗?"
  • 我应该打印一下 socket 的内容,检查一下 print(socket)

撰写回答