传递的 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 个模块,foo
、bar
、call_method
和 driver
。 foo
、bar
和 call_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
所以我有一个包含三个模块的 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 个模块,foo
、bar
、call_method
和 driver
。 foo
、bar
和 call_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