[英]Why is this variable now cross-module global in python?
我將稍微簡化代碼,以希望有人可以對此有所了解,如果我做錯了,也許可以給我一種更蟒蛇的方法。
內部dbcontrollers.py
import autosettings
import aerialcontroller
import controller
import gobject
import gtk
import utils
# Create the settings object so we can call and edit settings easily
SETTINGS = autosettings.autoSettings()
CONTROLLERS = {}
class dBControllers(object):
def __init__(self):
# This works happily so nothing wrong in autosettings module
print SETTING.last_port
port_to_use = SETTINGS.last_port
if __name__ == "__main__":
# Create an object that holds all the GTK stuff (when not simplified)
dBControllers = dBControllers()
aerialController = aerialcontroller.aerialController()
內建Aerocontroller.py
class aerialController(object):
def __init__(self):
self.motor_number = str(SETTINGS.aerial_motor_number)
CONTROLLERS[self.motor_number] = self
但是,當我運行此命令時,出現“ NameError:全局名稱'SETTINGS'未定義”。
我真的不明白這應該如何工作,在模塊之間共享全局變量。 我認為這不是做這樣的事情的正確方法,所以有人可以指出我正確的方向。
謝謝。
PS Simply代碼示例將是有益的-仍然是python的相對新手。
Python沒有辦法在模塊之間共享名稱。 如果要從多個模塊訪問某些內容,請在一個單獨的模塊中聲明它(例如“設置”),然后將其導入到任何需要的位置。
settings.py:
SETTINGS = autosettings.autoSettings()
CONTROLLERS = {}
aerialcontroller.py
from settings import SETTINGS, CONTROLLERS
class aerialController(object):
def __init__(self):
self.motor_number = str(SETTINGS.aerial_motor_number)
CONTROLLERS[self.motor_number] = self
注意:只要您只想修改 SETTINGS,就可以from settings import SETTINGS
SETTINGS。 如果要用一組新的設置( SETTINGS = ...
)完全替換它,則需要導入設置,並將其稱為settings.SETTINGS
。
這是設計使然:如果模塊從導入腳本的腳本中獲取了變量,那么在讀取代碼時(從其他地方導入模塊可能無法工作),很難看清它們的來源。 這樣,您始終可以看到變量來自每個文件的位置(嗯,幾乎總是這樣:請不要過度使用from <name> import *
)。
我認為最明智的方法是使您的aerialController
類采用設置和控制器對象:
class aerialController(object):
def __init__(self, settings, controllers):
self.motor_number = str(settings.aerial_motor_number)
controllers[self.motor_number] = self
...然后在另一個模塊中:
if __name__ == "__main__":
dBControllers = dBControllers()
aerialController = aerialcontroller.aerialController(SETTINGS, CONTROLLERS)
您可能會更好地構造它,並傳遞電動機編號,然后調用者將其分配給controllers
,但這是在偏離主題……
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.