如何在另一个模块中引用对象属性
我对Python还比较陌生,以前用的是C#,希望有人能帮我解答这个问题。我有一个叫做actuators.py的模块,里面定义了几个类,用来描述我在机器人项目中使用的伺服电机的属性和方法。在另一个模块robot.py中,我是这样实例化我的伺服电机的:
import actuators as Actuators
myActuators = Actuators.AllActuators()
这样一来,只要我在robot.py模块里,就可以访问伺服电机的属性。例如,我可以写:
print myActuators.HeadTilt.MinPosition
来获取倾斜机器人头部的伺服电机允许的最小值。到目前为止,一切都很好。
现在我想在一个单独的线程中访问这些相同的值,这个线程是在另一个模块tilt_head.py中定义的。我想我需要导入robot.py模块的引用,但这样做会重新执行robot.py中的所有代码,而我其实只想要一个指向myActuators对象的静态引用。而且我不能使用
from robot.py import myActuators
因为myActuators并不是一个模块。
在C#中,我会用这样的声明来做到这一点:
public static Actuators myActuators;
这样就可以在项目中的任何其他文件中引用myActuators。请问在Python中有没有类似的方法?如果你需要我的实际代码,我很乐意分享。
谢谢!
5 个回答
你可以简单地使用:
from robot import myActuators
你不能说“from robot.py”,因为那里的名字是模块名,而不是文件名。
顺便说一下,我不太明白你为什么要用 import actuators as Actuators
。你为什么想要改变字母的大小写呢?模块的名字通常都是小写的。
正如其他人所说,你实际上可以从机器人模块中导入myActuators。为了避免在导入时代码被重新执行,标准的Python做法是把独立的代码放在一个if __name__ == '__main__':
的条件语句里,这样只有当这个模块作为独立应用运行时,里面的代码才会执行,而在被导入时就不会执行。
比如:
# Things that are defined when robot.py is used as a module
# and when used standalone.
import actuators as Actuators
myActuators = Actuators.AllActuators()
if __name__ == '__main__':
# Stuff that you only want executed when running robot.py
然后当你想在另一个模块中使用robot.py时,你应该可以这样做:
from robot import myActuators
编辑:
实际上,正如JAB指出的,我在解释条件执行时有点混淆。如果你重新加载模块,你的代码不会被重新执行。模块加载机制会处理模块的重新加载,确保它们只被加载和定义一次。之后的加载都是对之前加载的模块的引用。不过,如果你有一些步骤只想在以脚本形式运行模块时执行,那么你可以把它们放在if语句块里,这样在从另一个模块加载robot时就不会执行这些步骤。
我想这并没有真正解决你的问题,虽然看起来你的问题其实是导入语法不正确。
我不能使用
from robot.py import myActuators
因为 myActuators 不是一个模块。
其实 myActuators
并不需要是一个模块。你完全可以这样做。(不过你最好用 robot
而不是 robot.py
)
http://docs.python.org/reference/simple_stmts.html#import
还有:
http://docs.python.org/tutorial/modules.html#more-on-modules
“一个模块可以包含可执行的语句和函数定义。这些语句的目的是初始化模块。它们只在模块第一次被导入时执行。”
所以,如果你用一个脚本来导入 robot
然后再导入 tilt_head
,那么 robot.py
中的可执行内容不会被多次运行。
当然,如果 robot.py
是程序的主要模块,那我建议你参考 A. Levy 的回答。