0

John V. Guttag による Python 入門の本を購入し、独学で Python を学ぼうとしています。ほとんどの部分は順調に進んでいますが、この本では語られていない質問があります。前回は酔っ払いシミュレーションについてお話しました。シミュレーションでは、フィールド クラスを使用して酔っ払いが入るフィールドを作成します。次に、継承を使用して別の種類のフィールドを作成します。酔っぱらいが端に行くのを制限し、酔っ払った人が振り向かなければならないフェンスで囲まれたフィールドを作るにはどうすればよいか疑問に思っていました。フィールドコードは次のとおりです。

class Field(object):
    def __init__(self):
        self.drunks = {}

    def addDrunk(self, drunk, loc):
        if drunk in self.drunks:
            raise ValueError('Duplicate drunk')
        else:
            self.drunks[drunk] = loc

    def moveDrunk(self, drunk):
        if drunk not in self.drunks:
            raise ValueError('Drunk not in field')
        xDist, yDist = drunk.takeStep()
        currentLocation = self.drunks[drunk]
        #use move method of Location to get new location
        self.drunks[drunk] = currentLocation.move(xDist, yDist)

    def getLoc(self, drunk):
        if drunk not in self.drunks:
            raise ValueError('Drunk not in field')
        return self.drunks[drunk]

継承を使用して作成したもう 1 つのフィールドは次のとおりです。

class oddField(Field):
    def __init__(self, numHoles, xRange, yRange):
        Field.__init__(self)
        self.wormholes = {}
        for w in range(numHoles):
            x = random.randint(-xRange, xRange)
            y = random.randint(-yRange, yRange)
            newX = random.randint(-xRange, xRange)
            newY = random.randint(-yRange, yRange)
            newLoc = Location(newX, newY)
            self.wormholes[(x, y)] = newLoc

    def moveDrunk(self, drunk):
        Field.moveDrunk(self, drunk)
        x = self.drunks[drunk].getX()
        y = self.drunks[drunk].getY()
        if (x, y) in self.wormholes:
            self.drunks[drunk] = self.wormholes[(x, y)]

奇数フィールドはワームホールを使って酔っぱらいを動かします。これはかなりクールです。私はまだPythonに慣れていないので、これがどのように機能するのか興味があります。

4

2 に答える 2

1

moveDrunk() メソッドのロジックをオーバーライドするだけで、座標が目的のデカルト空間の外にある場合に酔っぱらいがフェンス内に留まり、初期化をオーバーライドして、制限されたデカルト空間を提供します。次の擬似コードを検討してください。

class stephenDaedalus(Field):

def init(self, cartesianSpace): Field.init(self) self.fence = cartesianSpace ... def moveDrunk(self): '''Note where our drunk is located, as he may do something impossible''' lastX = self.drunks[drunk].getX() lastY = self.drunks[drunk].getY() Field.moveDrunk(self, drunk) x = self.drunks[drunk].getX() y = self.drunks[drunk].getY() '''check that our drunk is still within parameters''' if (x, y) in self.cartesianSpace.points: self.drunks[drunk] = currentLocation.move(x, y) '''and if he is not, he will stumble back to the old manifold''' else: self.drunks[drunk] = currentLocation.move(lastX, lastY)

CartesianField クラスを実装する必要がありますが、これを数学的に考えると、ポイントのリストを受け入れて、リストで区切られたフィールド内の整数ポイントで別のリストを埋めたいと思うでしょう。新しいプログラマーにとって興味深い挑戦です。Python の矩形クラスを使用して、ユークリッドの頭痛の種から解放されることを検討してください。

https://wiki.python.org/moin/PointsAndRectangles

于 2016-03-28T22:11:18.583 に答える
1

あなたの質問がサブクラスのメソッドmoveDrunkがどのように機能するかについてであると仮定します。OddField

サブクラスはそのスーパークラスを拡張します (これは、すべてではないにしてもほとんどの OO 言語に適用されます)。OddFieldここでのクラスは、Field クラスを拡張し、 というプロパティを追加しwormholes、スーパークラスのメソッドをオーバーライドしmoveDrunkて、新しい実装を提供します。

サブクラスには、そのスーパークラスのすべてのメンバーが含まれるようになりましたが、1 つの新しいプロパティとmoveDrunk、サブクラスにより関連性の高い、よりカスタマイズされた実装も含まれています。

OddFieldしたがって、サブクラスが通常のフィールドのように機能できることはわかっていますが、 の実装に起因する追加の動作がありOddFieldます。したがって、moveDrunkメソッドを呼び出すとOddField、スーパークラスの動作ではなく、新しい動作が実装されます。

ただし、ワームホールの仕組みに関する質問であれば、申し訳ありませんが、その点についてはお答えできません。;)

于 2016-03-28T22:03:17.983 に答える