如何从其他类导入变量

时间:2012-06-08 16:53:33

标签: python

我有一个类的实例,我在名为'Greek_gods'的模块中名为'zeus'的类中将值设置为'self.world'。我在模块名称“世界”中有另一个班级名称“世界”。

我如何告诉宙斯去'世界'并获得实例self.world?

#module named World
class World():

    def __init__(self):
        self.world = Atlas()


#module named Greek_gods
class zeus():

    def __init__(self)

4 个答案:

答案 0 :(得分:2)

你不能,因为在你创建Zeus时,你无法知道Zeus中要添加的世界实例。

但是,您可以为World传递Zeus的实例。有多种方法可以做到:

  • World作为参数传递给构造函数:

    #module named greek_gods
    class Zeus(object):
        def __init__(self, world):
            self.world = Atlas()
    
    world = World()
    zeus = Zeus(world)
    
  • 您可以World创建Zeus

    #module named World
    class World(object):
        def __init__(self, world):
            self.world = Atlas()
        def create_zeus(self):
            zeus = Zeus()      # It would be better to pass it as a constructor 
            zeus.world = world # parameter but let us leave it simple
    
     # Using your classes:
     world = World()
     zeus = World.create_zeus()
    
  • 您可以在world模块中创建一个特殊的World实例:

    #module named World
    class World(object):
        def __init__(self):
            self.world = Atlas()
    greek_world = World()
    
    
    #module named Greek_gods
    import world
    class Zeus(object):
        def __init__(self):
            self.world = world.greek_world
    

我建议使用第二种解决方案;在那之后,第一个。但是,第三个也非常有用,特别是如果默认情况下,你的应用程序中只需要一个世界(所谓的singletons)。

答案 1 :(得分:1)

# module World
class World(object):
    def __init__(self, name):
        self.name = name
        self.gods_here = set()

    def leave(self, god):
        self.gods_here.remove(god)
        return True

    def enter(self, god):
        self.gods_here.add(god)
        return True

# module Greek_Gods
class God(object):
    def __init__(self, name, world=None):
        self.name = name
        self.world = None
        self.go_to_world(world)

    def go_to_world(self, world):
        if self.world is not None:
            self.world.leave(self)
        if world is not None:
            if world.enter(self):
                self.world = world
        else:
            self.world = None

earth = World("Earth")
mars = World("Mars")

zeus = God("Zeus", mars)
zeus.go_to_world(earth)

答案 2 :(得分:1)

它完全符合您的要求 - 它转到World模块并获取World的实例的world属性:

#module named World
class World():
    def __init__(self):
        self.world = Atlas()


#module named Greek_gods
from World import World

class zeus():    
    def __init__(self)
        self.world = World().world

虽然可以做得更干净,但如果你能告诉我们这样做的原因是什么。如果您将Atlas()分配给class'es属性world,您甚至可以缩短代码。引用它和清洁它会更短,但工作方式几乎相同。

答案 3 :(得分:0)

您希望在多个模块中使用World类的单个实例,您可以通过在{{的顶层创建World类的实例轻松完成此操作。 1}}模块,像这样:

World

现在,当您在任何其他模块中#module named World class World(): def __init__(self): self.world = Atlas() world = World() 时,可以使用import World作为World.world课程的唯一实例。这有点令人困惑,因为World现在是World.world.world类创建的Atlas的实例,我强烈建议在那里重命名。

以下是World模块的外观:

Greek_gods

请注意,我没有将#module named Greek_gods import World class zeus(): world = World.world.world 放入world类的初始值设定项中,而是将其设为类属性。这是因为您希望在所有zeus实例中共享此Atlas实例(由于某种原因称为world)。有关其外观的示例,请查看以下代码(您可以将其放入zeus模块中进行测试):

Greek_gods