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

Python项目结构合理性咨询及dog.py导入方式优化方案求解

问题

项目结构与模块导入疑问

我自学Python已有一段时间,但始终未能掌握规范的项目结构。当前我的项目结构如下:

my_project/
    src/
        __init__.py
        dog.py
        animal.py
    main.py

(注:原结构中__init__.pyt为笔误,需改为__init__.py才能识别为Python包)

各脚本代码如下:

animal.py

class animal:
    def __init__(self, kind):
        self.kind = kind

if __name__=='__main__':
    a=animal("mammal") 

dog.py

if __name__=='__main__':
    from animal import animal
else:
    from .animal import animal

        
class dog(animal):
    def __init__(self, name, age):
        super().__init__('Mammal')
        self.name = name
        self.age = age
        
        
if __name__=='__main__':
    d=dog("Fido", 3)

init.py

from .animal import * 
from .dog import * 

main.py

import src 
d=src.dog("Fido", 3)

我的问题是:当前这种项目结构是否至少可行?另外我认为dog.py中的导入方式十分繁琐,找不到既能单独运行dog.py进行开发测试,又能在src目录外部(如运行main.py时)正确导入模块的其他方法。


回答

1. 当前项目结构的可行性

修正__init__.pyt为__init__.py后,这个结构完全可行,属于Python最基础的包结构,能满足小型项目的运行需求。不过从代码规范角度,建议类名遵循PEP8的大驼峰命名法(比如Animal而非animal,Dog而非dog),提升代码可读性。

2. 简化dog.py的导入方式

你当前的导入写法确实冗余,以下两种方案可以实现“单文件运行测试+外部调用正常导入”的需求:

方案一:统一使用绝对导入(推荐)

把项目根目录(my_project/)添加到Python的模块搜索路径,这样不管是单独运行dog.py还是通过main.py调用,都能用统一的绝对导入语句:

# dog.py
from src.animal import Animal  # 同步修正类名为大驼峰

class Dog(Animal):
    def __init__(self, name, age):
        super().__init__('Mammal')
        self.name = name
        self.age = age
        
if __name__=='__main__':
    d=Dog("Fido", 3)

添加搜索路径的方式:

  • 临时配置:运行dog.py前,终端执行export PYTHONPATH=/你的项目路径/my_project(Linux/macOS)或set PYTHONPATH=C:\你的项目路径\my_project(Windows)
  • 永久配置:把my_project路径添加到系统环境变量的PYTHONPATH中

方案二:动态添加项目路径到搜索列表

在dog.py开头加入代码,自动识别项目根目录并添加到搜索路径,无需手动配置环境变量:

# dog.py
import sys
from pathlib import Path

# 获取项目根目录(my_project/)的绝对路径
project_root = Path(__file__).parent.parent
sys.path.append(str(project_root))

from src.animal import Animal

class Dog(Animal):
    def __init__(self, name, age):
        super().__init__('Mammal')
        self.name = name
        self.age = age
        
if __name__=='__main__':
    d=Dog("Fido", 3)

这种方式更灵活,适合本地开发测试场景。

3. 额外规范建议

  • __init__.py避免用*导入,明确写出需要导出的类,比如from .animal import Animal; from .dog import Dog,减少命名冲突风险
  • 后续项目复杂度提升后,建议单独创建tests/目录存放测试代码,代替在模块内写if __name__=='__main__'的临时测试逻辑

内容的提问来源于stack exchange,提问作者pawelofficial

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 20:23:23