You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

导入其他模块的类时实例化报错 - Python技术求助

问题分析与解决方案

嘿,我来帮你搞定这个问题!首先看你遇到的NameError,核心原因是导入方式不对,你导入了system.system模块,但直接用System()时Python找不到这个名称——因为它属于system.system这个命名空间。另外你的代码还有几个小问题(比如Path类的继承逻辑、类方法定义),我一步步给你修正:

1. 先解决核心的NameError:修正导入方式

你当前的import system.system只是导入了模块,但System类是模块内的成员,所以直接调用System()会报错。有两种简单的解决方式:

方式一:直接导入目标类

把index.py的导入语句改成这样,就能直接使用类名:

from system.system import System
from system.path import Path

方式二:通过模块命名空间访问

如果想保留原导入方式,调用时要加上模块前缀:

import system.system
import system.path

sys = system.system.System()
path = system.path.Path()

2. 修正system.py的类方法错误

你的System类里有个明显问题:inf()方法没有self参数,而且引用version时没有指定实例/类,修改后:

class System:
    version = "0.1.0b"
    inf = ""

    def __init__(self):
        # 注意:这里的路径是相对于运行index.py的目录,确保inf.txt在index.py的上级目录存在
        self.inf = open("../inf.txt").read()

    def show_inf(self):  # 改名避免和实例属性inf重名,更清晰
        print(self.version)
        print(self.inf)

3. 修正path.py的继承与方法逻辑

你的Path类继承System的方式完全错误,构造函数、方法都写成了全局函数,不是类的成员,修改后:

from system.system import System  # 正确导入父类

class Path(System):
    def __init__(self, start_dir="/"):
        super().__init__()  # 必须调用父类的构造函数
        self.val = start_dir  # 用实例属性,避免所有Path实例共享同一个路径

    def get_path(self):
        print(self.val)

    def change_dir(self, new_dir):  # 实现你在index.py里调用的changeDir方法,符合Python命名规范
        # 简单实现目录切换逻辑,可根据需求扩展
        if new_dir == "..":
            self.val = "/".join(self.val.split("/")[:-1]) or "/"
        else:
            self.val = f"{self.val}/{new_dir}".replace("//", "/")

4. 修正index.py的其他细节问题

比如raw_input是Python2语法(如果用Python3要改成input()),还有changeDir调用时需要传入参数,修改后的完整代码:

from system.system import System
from system.path import Path

input_str = ""
command = ""
sys = System()
path = Path()  # 默认从根目录启动

def loop():
    global path, input_str
    # Python3用input(),Python2保留raw_input(),根据你的环境调整
    input_str = input(f"{path.val} > ")
    format_str(input_str)

def format_str(input_str):
    global command
    # 用split()简化命令提取,比手动遍历字符更简洁
    command = input_str.split()[0].lower() if input_str.strip() else ""
    if command == "exit":
        exit()
    else:
        interpret()

def interpret():
    global command, path
    if command == "cd":
        # 获取cd后面的目录参数,默认切换到根目录
        new_dir = input_str.split()[1] if len(input_str.split()) > 1 else "/"
        path.change_dir(new_dir)
    loop()

# 启动交互循环
loop()

5. 可选优化:让导入更简洁

如果你想在index.py里直接import system就能使用所有类,可以修改system/__init__.py:

from .system import System
from .path import Path

__all__ = ["System", "Path"]

这样index.py的导入可以简化成:

from system import System, Path

最后测试

确保你的目录结构正确,inf.txt存在(可以随便写点测试内容),然后运行python index.py,就能正常启动交互:输入cd test切换目录,输入exit退出,完全符合你的需求。


内容的提问来源于stack exchange,提问作者J-Cake

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:19:28