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

2023-06-20 10:54:45 +08:00
 maxssy
现在很多时候报错了只敢在函数里引用了
1742 次点击
所在节点    Python
12 条回复
ruanimal
2023-06-20 11:04:03 +08:00
不会划分模块就别划分,都写一个文件得了

模块之间的逻辑关系理清楚,不要父亲指向儿子,儿子又指向父亲。。
maxssy
2023-06-20 11:07:19 +08:00
@ruanimal 怎么才算会划分模块? 以前写 JAVA, PHP 和 node 都没发现过这样的问题
fgwmlhdkkkw
2023-06-20 11:15:29 +08:00
可以把 import 写到函数里面……😓
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
2023-06-20 11:18:20 +08:00
在函数里引用 又不是不能用。就这样搞吧。反而还能。。。提升初次启动速度。。。
lambdaq
2023-06-20 11:20:11 +08:00
> 如果在 base.py 注册所有子类,就循环依赖了。

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

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

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

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

遇到互相引用的还是单独开一个工厂模块之类的, 构造的时候把需要的对象传递到工厂方法里去. 还有很多其他方案就不一一细说了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/950239

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX