如何在另一个模块中引用对象属性

时间:2010-06-28 17:14:32

标签: python

我对使用C#多年的Python相对较新,我希望有人可以帮我解决这个问题。我有一个名为actuator.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 个答案:

答案 0 :(得分:2)

  

我无法使用

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的答案。

答案 1 :(得分:1)

你应该可以简单地使用:

from robot import myActuators

您不能说“来自robot.py”,因为名称中有一个模块名称,而不是文件名。

顺便说一句:我不确定你为什么这么做import actuators as Actuators。你为什么要改变这个案子?模块通常是小写的。

答案 2 :(得分:1)

正如其他人所说,你实际上可以从机器人模块导入myActuators。为了解决重新执行机器人代码的问题,标准的Python方法是将独立代码包装在if __name__ == '__main__':中,这样只有在模块用作独立应用程序时才会执行,但不是在导入时。

E.G。

# 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块中,并且在从其他模块加载机械手时不会执行这些步骤。

我想它并没有真正解决你的问题,虽然看起来你的问题确实是一个错误的导入语法。

答案 3 :(得分:0)

我猜你可以将该对象作为robot.myActuators访问,因为它已经存在于robot.py命名空间内的进程中。

答案 4 :(得分:0)

非常感谢所有的答案和指示。事实证明,我的问题是递归导入,最终尝试不止一次创建一个对象。通过逻辑上整理实例创建,我终于能够解决问题。