Функции сильно отличаются от классов. Похоже, вы взяли функцию и только что изменили def
на class
. Я думаю, что в основном работает в вашем случае, но это не то, как должны идти классы.
Классы содержат функции (методы) и данные. Например, у вас есть мяч:
class Ball(object):
# __init__ is a special method called whenever you try to make
# an instance of a class. As you heard, it initializes the object.
# Here, we'll initialize some of the data.
def __init__(self):
# Let's add some data to the [instance of the] class.
self.position = (100, 100)
self.velocity = (0, 0)
# We can also add our own functions. When our ball bounces,
# its vertical velocity will be negated. (no gravity here!)
def bounce(self):
self.velocity = (self.velocity[0], -self.velocity[1])
Теперь у нас есть Ball
класса. Как мы можем его использовать?
>>> ball1 = Ball()
>>> ball1
<Ball object at ...>
Это не очень полезно. Данные могут быть полезными:
>>> ball1.position
(100, 100)
>>> ball1.velocity
(0, 0)
>>> ball1.position = (200, 100)
>>> ball1.position
(200, 100)
Хорошо, круто, но в чем преимущество над глобальной переменной? Если у вас есть еще один Ball
экземпляр, он будет оставаться независимыми:
>>> ball2 = Ball()
>>> ball2.velocity = (5, 10)
>>> ball2.position
(100, 100)
>>> ball2.velocity
(5, 10)
И ball1
остается независимым:
>>> ball1.velocity
(0, 0)
что теперь об этом bounce
метода (функции в классе) мы определили?
>>> ball2.bounce()
>>> ball2.velocity
(5, -10)
bounce
метод вызвал его модифицировать velocity
данные себе. Опять же, ball1
не тронули:
>>> ball1.velocity
Применение
Мяч аккуратно и все, но большинство людей не имитируя, что. Вы делаете игру. Давайте думать о том, какие вещи, которые мы имеем:
- Комната самая очевидная вещь, которую мы могли бы иметь.
Итак, давайте сделаем комнату. Номера имеют имена, поэтому мы будем иметь некоторые данные для хранения, что:
class Room(object):
# Note that we're taking an argument besides self, here.
def __init__(self, name):
self.name = name # Set the room's name to the name we got.
И давайте сделаем его экземпляр:
>>> white_room = Room("White Room")
>>> white_room.name
'White Room'
элегантным. Это оказывается не таким полезным, если вы хотите, чтобы разные комнаты имели разные функциональные возможности, поэтому давайте сделаем подкласс . A подкласс наследует всю функциональность от своего суперкласса, но вы можете добавить больше функциональности или переопределить функциональность суперкласса.
Давайте подумаем о том, что мы хотим сделать с номерами:
Мы хотим взаимодействовать с номерами.
И как мы это сделаем?
Пользователь вводит в текстовую строку, на которую реагирует.
Как это ответил бы, зависит от помещения, так что давайте сделать комнату справиться, что с помощью метода под названием interact
:
class WhiteRoom(Room): # A white room is a kind of room.
def __init__(self):
# All white rooms have names of 'White Room'.
self.name = 'White Room'
def interact(self, line):
if 'test' in line:
print "'Test' to you, too!"
Теперь давайте попробуем взаимодействовать с ним:
>>> white_room = WhiteRoom() # WhiteRoom's __init__ doesn't take an argument (even though its superclass's __init__ does; we overrode the superclass's __init__)
>>> white_room.interact('test')
'Test' to you, too!
Ваш оригинальный пример показал перемещение между комнатами. Давайте используем глобальную переменную, называемую current_room
, чтобы отслеживать, в какой комнате мы находимся. Давайте также сделаем красную комнату.
1. Здесь есть лучшие варианты, кроме глобальных переменных, но я собираюсь использовать их для простоты.
class RedRoom(Room): # A red room is also a kind of room.
def __init__(self):
self.name = 'Red Room'
def interact(self, line):
global current_room, white_room
if 'white' in line:
# We could create a new WhiteRoom, but then it
# would lose its data (if it had any) after moving
# out of it and into it again.
current_room = white_room
Теперь давайте попробуем, что:
>>> red_room = RedRoom()
>>> current_room = red_room
>>> current_room.name
'Red Room'
>>> current_room.interact('go to white room')
>>> current_room.name
'White Room'
Упражнение для читателя: Добавьте код WhiteRoom
«s interact
, что позволяет вернуться в красную комнату.
Теперь, когда у нас все работает, давайте все вместе. С нашими новыми данными name
во всех номерах мы также можем отобразить текущую комнату в строке!
def play_game():
global current_room
while True:
line = raw_input(current_room.name + '> ')
current_room.interact(line)
Вы также можете захотеть сделать функцию сброса игры:
def reset_game():
global current_room, white_room, red_room
white_room = WhiteRoom()
red_room = RedRoom()
current_room = white_room
Поместите все определения классов и эти функции в файл, и вы можете играть в командной строке, как это (при условии, что они находятся в mygame.py
):
>>> import mygame
>>> mygame.reset_game()
>>> mygame.play_game()
White Room> test
'Test' to you, too!
White Room> go to red room
Red Room> go to white room
White Room>
чтобы иметь возможность играть в игру, просто запустив сценарий Python, вы можете добавить это в нижней части:
def main():
reset_game()
play_game()
if __name__ == '__main__': # If we're running as a script...
main()
И это базовое введение в классы и способы применения его к вашей ситуации.
Этот 'Ball' не должен быть классом. Правило большого пальца: если у него есть только два метода, один из которых - '__init__', вы должны использовать функцию и функцию functools.partial для привязки функции к некоторым данным. То же самое для других классов, представленных здесь. Python - это не Java! Единственное, что я вижу здесь, что * должен быть классом, это сама игра, для которой вместо этого вы используете модульное глобальное состояние? –
В разделе пользовательских упражнений я попытался перейти из белой комнаты в красную комнату. Но я не могу. Я добавил «if» x «in line: current_room = red_room» Текущая переменная комнаты не изменяется. Однако, если я делаю что-то вроде: «если« х »в строке: напечатайте« это », это работает. Спасибо за ваше сообщение. Это было очень полезно! –
Nevermind Я понял это! Еще раз спасибо за вашу помощь :) –