2016-03-28 1 views
0

Я купил введение в книгу 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] 

и вот другое поле он сделал с помощью наследования:

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)] 

нечетного поле использует wormwholes для перемещения пьяного, который является довольно прохладно. Я все еще новичок в python, поэтому мне интересно, как это будет работать.

+1

Не могли бы вы быть более точным с вопросом, что именно вам интересно действительно ли это 'метод moveDrunk' в подклассе' oddField', что вы интересуются? –

+0

Действительно ли так сложно правильно отложить код? Я бы исправил это для вас, но в последний раз, когда я сделал что-то вроде этого, мое редактирование было отклонено, и я могу понять, почему, я не могу быть уверенным в ваших намерениях. – Goyo

+0

Да, я сожалею об этом. Я не понимал, что он не отступил должным образом. –

ответ

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

+0

Спасибо, что помогли! –

1

Предполагая, что ваш вопрос связан с тем, как работает метод moveDrunk в подклассе OddField.

подкласс расширяет суперкласс (это относится и к большинству, если не все языки оо) OddField класса здесь расширяет класс поля в том, что он добавляет свойство wormholes, а также отменяет суперкласс moveDrunk метода означает, что он придает ему новая реализация.

Подкласс теперь имеет все члены его суперкласса, но с одним новым свойством, а также более индивидуальную реализацию moveDrunk, которая более уместна для подкласса.

Таким образом, мы знаем, что подкласс OddField может действовать как нормальное поле, но имеет дополнительное поведение, которое происходит от реализации OddField. Поэтому, если мы назовем метод moveDrunk на нашем OddField, он будет реализовывать новое поведение вместо поведения в нашем суперклассе.

Но если ваш вопрос о том, как работают червоточины, извините, но я не могу вам помочь. ;)

Смежные вопросы