V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
maxssy
V2EX  ›  Python

Python 引用需要遵守什么规则吗?总是出现循环引用

  •  
  •   maxssy · 2023-06-20 10:54:45 +08:00 · 1764 次点击
    这是一个创建于 551 天前的主题,其中的信息可能已经有所发展或是发生改变。
    现在很多时候报错了只敢在函数里引用了
    12 条回复    2023-06-20 18:38:17 +08:00
    ruanimal
        1
    ruanimal  
       2023-06-20 11:04:03 +08:00
    不会划分模块就别划分,都写一个文件得了

    模块之间的逻辑关系理清楚,不要父亲指向儿子,儿子又指向父亲。。
    maxssy
        2
    maxssy  
    OP
       2023-06-20 11:07:19 +08:00
    @ruanimal 怎么才算会划分模块? 以前写 JAVA, PHP 和 node 都没发现过这样的问题
    fgwmlhdkkkw
        3
    fgwmlhdkkkw  
       2023-06-20 11:15:29 +08:00
    可以把 import 写到函数里面……😓
    ruanimal
        4
    ruanimal  
       2023-06-20 11:17:26 +08:00
    @maxssy 因为 Python 没有编译流程,所以类似 Java 或者 c 那样划分文件很容易出现循环依赖。

    比如 基类在 base.py, 子类在 child_a.py child_b.py, 如果在 base.py 注册所有子类,就循环依赖了。
    如果在子类模块中注册子类到 base.py 就没有问题(在 child_a.py 中调用 base.py 的方法进行注册)。
    lambdaq
        5
    lambdaq  
       2023-06-20 11:18:20 +08:00
    在函数里引用 又不是不能用。就这样搞吧。反而还能。。。提升初次启动速度。。。
    lambdaq
        6
    lambdaq  
       2023-06-20 11:20:11 +08:00
    > 如果在 base.py 注册所有子类,就循环依赖了。

    这不简单。。既然你有个 地板类,那么把所有子类放到一起理所应当应该叫 天花板类。建议搞一个 tianhuaban.py 来注册。
    ruanimal
        7
    ruanimal  
       2023-06-20 11:25:36 +08:00
    @lambdaq 是啊,第三者插足,确实是常见的解决方案
    ruanimal
        8
    ruanimal  
       2023-06-20 11:27:31 +08:00
    还有个场景,写 Java 的一般单例用的比较多,这些类的关系如果没梳理好也容易循环依赖
    enrolls
        9
    enrolls  
       2023-06-20 12:03:18 +08:00
    - 使用__init__.py 的时候,要注意(没掌握就留白)
    - 下层(基类)不要引用上层(子类)
    - 使用绝对 import 而不要相对 import
    - 主要包的命名(譬如, 叫 abc.py 或者 redis.py ,可能就有 import 问题
    itskingname
        10
    itskingname  
       2023-06-20 12:17:16 +08:00   ❤️ 4
    1. 代码文件尽量展平,不要有 Java 那种深层文件夹嵌套。类似于 aa/bb/cc/dd/ee/ff/gg.java 这种深层嵌套,在 Python 里面就是屎一样的结构。

    2. 调用遵循从外到内的方式。入口文件应该在最外面。例如根目录下面有一个 main.py 作为入口文件。其他被调用的文件可以放到子文件夹里面。Java 把入口文件放到一个很深的嵌套子文件夹里面的写法在 Python 中就是垃圾写法。

    3. 在上层文件中引入下层文件。或者同层文件之间引用。不要出现从下层文件引用上层文件的情况。如果出现了,你就应该把这个被公用的函数或者类抽出来,单独放到一个文件中。

    4. utils.py 这种工具函数、工具类的文件。里面只应该引用如下三种情况:Python 自带的库、第三方库、其他工具文件中的类或函数。 不应该出现工具文件中引用业务代码里面某个函数的情况。
    maxssy
        11
    maxssy  
    OP
       2023-06-20 13:01:02 +08:00
    @itskingname 学到了, 谢谢
    ClericPy
        12
    ClericPy  
       2023-06-20 18:38:17 +08:00
    代码结构设计有问题啊...

    遇到互相引用的还是单独开一个工厂模块之类的, 构造的时候把需要的对象传递到工厂方法里去. 还有很多其他方案就不一一细说了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2833 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 12:14 · PVG 20:14 · LAX 04:14 · JFK 07:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.