小能豆

无法实例化子目录中定义的类

py

我的(简化的)项目布局如下:

/__init__.py
/test.py
/lib/__init__.py
/lib/client.py

我的test.py很简单:

import lib.client
A = client()
A.Test()

我的lib\client.py开始如下:

import ui #(another class in the lib dir)

class client(object):
    """
    (Blah)
    """
    UI = None

    def __init__():
        UI = ui()

    def Test():
        print "Success"

当我尝试运行 test.py 时,我可以进入代码并看到客户端中的定义已被解析,但是,当我到达实例化客户端的行时,出现以下异常:

NameError: name 'client' is not defined

如果我将该行改为:

A = lib.client()

然后我得到

'module' object is not callable

我错过了什么?


阅读 25

收藏
2024-11-30

共1个答案

小能豆

在你的代码中有几个问题导致了你遇到的错误。我们来逐一分析并提供修正方法。

1. client 类的实例化问题

问题在于你的 lib/client.py 文件中的 client 类定义是没有正确的构造函数(__init__)签名的。类的构造函数必须接受 self 作为第一个参数,这样 Python 才能正确地实例化对象。

你的代码:

class client(object):
    UI = None

    def __init__():  # 没有 self 参数
        UI = ui()

正确的代码应该是:

class client(object):
    UI = None

    def __init__(self):  # 需要 self 参数
        self.UI = ui()  # 将 UI 赋值给实例变量
  • __init__ 方法必须接受 self 参数,否则无法访问实例本身。

2. 实例化对象时的问题

你写的是:

A = client()  # 出现 'module' object is not callable 错误

这个错误发生的原因是 client 作为模块名称和类名同名,Python 可能把 client 解释为模块,而不是类。为了避免这个问题,应该确保从模块中导入类,或明确指定类名。

正确的做法是这样导入类:

from lib.client import client

A = client()  # 现在可以正确实例化

或者你也可以这样修改 test.py,如果你希望直接通过 lib.client 访问类:

import lib.client

A = lib.client.client()  # 使用完整路径来实例化类

3. 方法定义的问题

在你的 client 类中,Test 方法没有使用 self 参数,这会导致无法访问实例的属性。它应该定义成:

class client(object):
    UI = None

    def __init__(self):
        self.UI = ui()

    def Test(self):  # 添加 self 参数
        print("Success")

完整的修正版本

以下是所有修改后的代码:

lib/client.py

import ui  # 假设 ui 是另一个类在 lib 目录中

class client(object):
    UI = None

    def __init__(self):
        self.UI = ui()  # 正确初始化 UI 实例

    def Test(self):
        print("Success")

test.py

from lib.client import client  # 正确导入类

A = client()  # 正确实例化 client 类
A.Test()  # 调用 Test 方法

总结

  • __init__ 方法需要有 self 参数。
  • 你的 Test 方法也需要 self 参数,以便它能访问实例的属性。
  • 使用正确的导入方式,避免命名冲突,确保 Python 正确地将 client 作为类而非模块使用。
2024-11-30