2012-06-08 82 views
0

我有一個類的實例,我在名爲'Greek_gods'的模塊內名爲'zeus'的類中將值設置爲'self.world'。並且在模塊名稱'World'中還有另一個類名'World'。如何從一個不同的類導入一個變量

我該如何告訴宙斯去'世界'並獲得self.world實例?

#module named World 
class World(): 

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


#module named Greek_gods 
class zeus(): 

    def __init__(self) 
+0

在本身內部實例化一個類的工作,看起來像那樣會是無限的? – dm03514

+0

@ dm03514:不,它會導致無限循環 - 爲了構建一個世界,你首先必須構建一個世界。 –

+1

您將通過無限實例化World()來獲取RuntimeError。你希望完成什麼? –

回答

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

你不能,因爲你無法知道這個世界實例中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我n全球模塊:

    #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)。

0

看起來要跨幾個模塊,您可以通過在你的World模塊的頂層創建World類的實例,這樣很容易做到使用World類的一個實例:

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

world = World() 

現在,當您在任何其他模塊中使用import World時,可以使用World.world作爲World類的唯一實例。這有點令人困惑,因爲World.world.world現在是類創建的Atlas的實例,我強烈建議在那裏重命名一些東西。

這是你的Greek_gods模塊的外觀:

#module named Greek_gods 
import World 

class zeus(): 
    world = World.world.world 

注意,而不是把world進入初始化爲zeus類,我做了一個類屬性。這是因爲它看起來像你想在所有zeus實例中共享這個實例(出於某種原因稱爲world)。對於如何做到這一點看一個例子,看看下面的代碼(你可以把你的Greek_gods模塊測試):

z1 = zeus() 
z2 = zeus() 
assert World.world.world is z1.world is z2.world 
+0

我相信OP說他在'World()'構造函數中實例化'World()'是一個錯字。 –

+0

@JoelCornett - 啊,謝謝,我沒有看到這個問題的編輯。 –

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()分配給課程的物業world,則甚至可以縮短代碼。參考它和更簡潔將會更短,但工作幾乎相同。

相關問題