2010-06-28 49 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

非常感謝所有的答案和指針。事實證明,我的問題是一個遞歸導入,最終嘗試多次創建一個對象。通過對實例創建進行更加合理的分析,我終於能夠讓問題消失。

相關問題