由 python 自定义 class 引发的两个问题
1. 循环 import
今天用 python 写着玩,自定义了一个class A, 放在 A.py 里, 遇到了个问题, 就是 这个 class A 在有些文件里面可以正常 import 到,在有些类里面 import 这个类,无论写成什么样,都会出现 ImportError.
后来发现,出现 ImportError 的文件, 出现了 循环import 的现象。 类似 c++ 里面的 头文件重复 include ,在这里的情况是, A.py import 了 B.py ,B.py import C.py, C.py import A.py 时, 就会出现 ImportError.
由于 Python 没有类似 c++ 的编译时 #ifndef #ifdef 机制,所以,在网上查到的 解决办法是 :在需要的时候 import ,而不是在文件头部 import.
比如这里 C.py import A.py 会发生错误的话, 则把 from A import A 从文件头部, 移到 需要 class A 的 函数体里面,这样就能解决 循环 import 的问题了。
2. __init__.py
以前见过一些这个文件,但不知道这个文件的作用。上网查了才知道。
在一个文件夹下,如果想把这个文件夹里面的所有内容作成一个包(package),则必须由一个 __init__.py ,这个文件即使没有内容,那么这个文件夹也可以作为一个 package 来使用了。
如果里面有内容,通常是 import xxxx 或者 from xxx import xxx .
比如 MyGame这个文件夹有个 由于这个 __init__.py , 则在引用 MyGame 这个包的时候会执行一次, 所以 在 import MyGame 这句时,就会执行 __init__.py 里面的内容, 会自动的 import 许多包。
这样就 使 外部代码 写减少了 许多 import
总结:
通过上面所说的两个问题,发现 python 的 import 的机制 和 c++ 的 include 机制非常像。但是以前自己只是用 python 临时写一些 小东西,并没有遇到这样的问题。只要稍微用python 做一些 比较面向对象的事情,这样的问题就会不可避免的遇到。
幸亏以前没有和别人说过自己 “熟悉python”,否则遇到这样的问题却需要花时间现看 是多么丢人的一件事。。。