0

「Greek_gods」という名前のモジュール内の「zeus」という名前のクラス内で値を「self.world」に設定したクラスのインスタンスがあります。モジュール名「World」内に別のクラス名「World」があります。

zeus に「World」に移動してインスタンス self.world を取得するように指示するにはどうすればよいですか?

#module named World
class World():

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


#module named Greek_gods
class zeus():

    def __init__(self)
4

4 に答える 4

2

ZeusZeus を作成する時点で追加されるワールド インスタンスを知ることができないため、できません。

Worldただし、 forのインスタンスを渡すことはできます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 モジュールで の特別なインスタンスを1 つ作成できます。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
    

2 番目のソリューションを使用することをお勧めします。その後、最初のもの。ただし、3 番目のものも非常に便利です。特に、デフォルトで、アプリケーションに必要なワールドが 1 つだけの場合 (いわゆるシングルトン)。

于 2012-06-08T17:02:05.680 に答える
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)
于 2012-06-08T17:00:40.020 に答える
1

それはあなたが求めたことを正確に行います-それはモジュールに行き、のインスタンスの属性Worldを取ります:Worldworld

#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。それを参照する方が短くてきれいですが、ほとんど同じように機能します。

于 2012-06-08T17:02:29.147 に答える
0

次のように、モジュールのトップレベルでクラスWorldのインスタンスを作成することで簡単に実行できます。WorldWorld

#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これがどのように見えるかの例として、次のコードをチェックしてください (テストのためにモジュールに入れることができます):

z1 = zeus()
z2 = zeus()
assert World.world.world is z1.world is z2.world 
于 2012-06-08T17:02:21.007 に答える