传递的 class 实例何时需要在 python 中导入

When does a passed class instance require an import in python

所以我有一个包含三个模块的 python 2.7 项目。两个包含 classes,一个是脚本。示例文件结构如下所示

project/

__main__.py
__init__.py 

- serial_connect/
    ser_conn.py
    __init__.py

- ui/
    parse_file.py
    __init__.py

ser_conn.py 包含一个 class 来处理与某些 RS-232 硬件设备的所有交互。它包含诸如 open(), close(), send_go() 之类的方法,基本上就是此连接所需的所有内容。

parse_file.py 包含一个 class,它具有与解析文件和获取与串行命令关联的文本命令相关的方法。

例如如果文本文件包含命令 "send_go" parse_file.py 将解析此命令并调用 Ser_Conn.send_go()

__main.py__ 包含 main() 函数。在 main() 中创建了 Ser_Conn class 的一个实例,然后传递给 Parse_File class 因为程序中只有一个串行连接实例main() 和 Parse_File class.

都需要它

我的问题如下

在Parse_File的方法中我调用了Ser_Conn实例的方法,例如Ser_Conn.send_go()但是parse_file.py没有抱怨没有

from serial_connect.ser_conn import Ser_Conn

__main__.py 中只存在 ser_conn 导入。为什么这有效?

您正在将连接实例传递给 parse_file,这意味着 Python 已经知道 class 和该对象的其他详细信息。所以这就是为什么您不需要在 parse_file 代码中再次导入 class 的原因。

如果您想在该文件中使用某些内容,则只需导入该内容。

创建对象时 Python 使用 class 构造对象,这就足够了。您当然可以在 parse_file 中添加该导入行,但前提是您确实需要在该文件中使用 class(否则导入行非常有用)。

在 python 中,一个实例携带着它需要的所有 "stuff" 来完成它的工作。在高层次上,(并且稍微简化)当你写:

qux.whatever

python 查看对象 qux 然后找到它的 whatever 属性(如果它有的话)。请注意 python 不关心 什么类型 qux 是什么,只关心它有一个 whatever 属性。我可以创建多个满足此接口的对象:

class Foo(object):
    whatever = 'Hey Dawg!'

class Bar(object):
    whatever = 'I satisfy the interface too!'

另请注意,这些对象可以在任何地方定义。只要您设法获得对该对象的引用(例如,它被传递到一个函数中),您就可以使用该对象及其所有属性和方法。

也许更具体的示例会有所帮助——假设您有 4 个模块,foobarcall_methoddriverfoobarcall_method 彼此不知道,但是 driver 导入了另外 3 个。然后你可以这样做:

# foo.py
class Foo(object):
   def method(self):
       return 'foo!'

# bar.py
class Bar(object):
    def method(self):
       return 'bar!'

# call_method.py
def go(object_with_method):
    print(object_with_method.method())

# driver.py
import call_method
import foo
import bar

call_method.go(Foo())  # call the method on a foo instance
call_method.go(Bar())  # call the method on a bar instance