2010-06-28 48 views
1

我对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中做类似的事情?如果你需要我的实际代码,我会很乐意发布它。

谢谢!

+2

只是一句澄清和术语。 Python没有C#所具有的“属性”。它确实有方法,并调用其数据成员“属性”。通过其广泛的动态编程能力,如果您需要它们,您可以破解出类似于C#属性的东西。我认为在这里,你只是指数据成员/属性。 – Karmastan 2010-06-28 17:23:24

回答

1

你应该能够简单地使用:

from robot import myActuators 

你不能“从robot.py”说,因为名字里有一个模块名称,而不是文件名。

顺便说一句:我不知道你为什么在做import actuators as Actuators。你为什么想改变这个案子?模块通常是小写字母。

0

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

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

“A模块包含可执行语句以及函数定义。这些陈述旨在初始化模块。他们

所以使用进口robot然后tilt_head,在robot.py可执行的东西不会被多次运行的脚本只执行第一次模块的地方进口。”

当然,如果robot.py是想成为该程序的主要模块,那么我会建议去与A.列维的回答。

1

正如其他人一直说,你可以从机器人模块实际导入myActuators。为了解决你的代码问题在重新执行机器人时,标准的Python方法是将独立代码包装在中,以便只在将模块用作独立应用程序时才执行,而不是在导入时执行。

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

我想这并不能真正解决你的问题,尽管看起来你的问题实际上是一个不正确的导入语法。

+0

不完全正确。如果将具有可执行代码的模块导入某个程序的某处,并且稍后导入另一个导入第一个模块的模块,则不会重新执行可执行代码。 – JAB 2010-06-28 17:55:22

+0

是的,你是对的。我会编辑我的答案。 – 2010-06-28 20:04:44

0

非常感谢所有的答案和指针。事实证明,我的问题是一个递归导入,最终尝试多次创建一个对象。通过对实例创建进行更加合理的分析,我终于能够让问题消失。

相关问题