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

1 投票
5 回答
663 浏览
提问于 2025-04-16 00:32

我对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 个回答

1

你可以简单地使用:

from robot import myActuators

你不能说“from robot.py”,因为那里的名字是模块名,而不是文件名。

顺便说一下,我不太明白你为什么要用 import actuators as Actuators。你为什么想要改变字母的大小写呢?模块的名字通常都是小写的。

1

正如其他人所说,你实际上可以从机器人模块中导入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时就不会执行这些步骤。

我想这并没有真正解决你的问题,虽然看起来你的问题其实是导入语法不正确。

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

撰写回答