为什么这个变量现在在python中是跨模块全局变量?

为什么这个变量现在在python中是跨模块全局变量?,python,module,object,scope,global-variables,Python,Module,Object,Scope,Global Variables,我将稍微简化代码,希望有人能对此有所了解,如果我所做的是错误的,也许会给我一个更具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 SETTING

我将稍微简化代码,希望有人能对此有所了解,如果我所做的是错误的,也许会给我一个更具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()
内置天线控制器.py

class aerialController(object):

    def __init__(self):

        self.motor_number = str(SETTINGS.aerial_motor_number)
        CONTROLLERS[self.motor_number] = self
from settings import SETTINGS, CONTROLLERS
class aerialController(object):

    def __init__(self):
        self.motor_number = str(SETTINGS.aerial_motor_number)
        CONTROLLERS[self.motor_number] = self
但是当我运行这个程序时,我得到了“NameError:未定义全局名称‘设置’”

我真的不明白这是怎么工作的,在模块之间共享全局变量。我想这不是做这类事情的正确方法,所以有人能给我指出正确的方向吗

多谢各位


另外,简单地编写示例代码将是有益的,因为它仍然是python的新手。

python没有跨模块共享名称的方法。如果您希望从多个模块中访问某些内容,请在单独的模块中声明(例如“设置”),然后将其导入到您需要的任何位置

settings.py:

SETTINGS = autosettings.autoSettings()
CONTROLLERS = {}
天线控制器

class aerialController(object):

    def __init__(self):

        self.motor_number = str(SETTINGS.aerial_motor_number)
        CONTROLLERS[self.motor_number] = self
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=…
)完全替换它,则需要执行导入设置,并将其称为
settings.settings


这是通过设计实现的:如果模块从导入它们的脚本中获取变量,那么在读取代码时就很难看到它们来自何处(并且从其他地方导入模块可能不起作用)。通过这种方式,您总是可以看到变量来自每个文件中的何处(好吧,几乎总是:请不要过度使用导入中的
*
)。

Python没有跨模块共享名称的方法。如果您希望从多个模块中访问某些内容,请在单独的模块中声明(例如“设置”),然后将其导入到您需要的任何位置

settings.py:

SETTINGS = autosettings.autoSettings()
CONTROLLERS = {}
天线控制器

class aerialController(object):

    def __init__(self):

        self.motor_number = str(SETTINGS.aerial_motor_number)
        CONTROLLERS[self.motor_number] = self
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=…
)完全替换它,则需要执行导入设置,并将其称为
settings.settings


这是通过设计实现的:如果模块从导入它们的脚本中获取变量,那么在读取代码时就很难看到它们来自何处(并且从其他地方导入模块可能不起作用)。通过这种方式,您可以始终看到每个文件中变量的来源(嗯,几乎总是:请不要过度使用导入中的
*
)。

我认为最明智的方法是让您的
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)

您可能可以更好地构造它,并将电机编号传递给调用方,调用方将分配给
控制器,但这偏离了主题…

我认为最明智的方法是让您的
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)

您可能可以更好地构造它,并将电机编号传递给调用方,调用方将分配给
控制器
,但这偏离了主题…

在“init.py”中有一个“aerialcontroller”的导入。。。在“aerialcontroller.py”中没有导入。需要有一个吗?如果是,什么?如何导入“init.py”?查看有关init文件的信息我已将我的“init.py”重命名为“dbcontrollers.py”以简化此问题。但是,到目前为止,仍然没有运气:(.如果你能通过它,它更容易测试。在“init.py”中有一个“aerialcontroller”的导入…在“aerialcontroller.py”中没有导入。需要导入吗?如果是,什么?我如何导入“init.py”?查看有关init文件的信息我已经将我的“init.py”重命名为“dbcontrollers.py”可能是为了简化这个问题。但是,到目前为止,仍然没有运气:(.如果你能通过测试,它会更容易测试。事实上,我认为你提到的最后一件事(将它添加到其实例化的控制器中)这可能是个好主意。不过,我不太喜欢将设置作为参数传递给构造函数。@Thomas K-在构造函数中传递设置和从模块中导入设置之间没有太大的区别-无论哪种方式,都是在可访问的命名空间中(本地与全局)当然,如果它只使用
air\u motor\u number
成员,这就是你需要传入的所有内容。它们在功能上是相同的,但从概念上讲,拥有一个共享模块比传递一个对象更整洁。不过,我只传递一个值没有问题。
控制器[aerial\u motor\u number]=aerialcontroller.aerialcontroller(aerial\u motor\u number)
@Thomas K-我不同意,我认为将依赖关系约束到需要的范围(即构造函数的本地范围)比模块级范围更为整洁;但这是一个意见问题。实际上,我认为你提到的最后一件事(将其添加到实例化的控制器中)可能是个好主意。不过,我不太喜欢将设置作为参数传递给构造函数。@Thomas K-在构造函数中传递与从模块导入之间没有太大区别-无论哪种方式,它都在可访问的命名空间中(本地与全局)当然,如果它只使用
air\u motor\u number
成员,这就是你需要传入的所有内容。它们在功能上是相同的,但从概念上讲,拥有一个共享模块比传递一个对象更整洁。不过,我只传递一个值没有问题。
控制器[Aerorial\u motor\u number]=AerolialController.AerorialController(Aerorial\u motor\u number)
@Thomas K-我不同意,我认为将依赖性限制在需要的范围(即loc)更为整洁