我有一个类的实例,我在名为'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)
答案 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