Вопрос по python, oop – Python - Классы и основы ООП

14

Я не до конца понимаю занятия. Я прочитал документацию по Python и несколько других руководств. Я понимаю основную суть этого, но не понимаю нюансов. Например, в моем коде здесь:

<code>class whiteroom():
    """ Pick a door: red, blue, green, or black. """

    do = raw_input("> ")

    if "red" in do:
        print "You entered the red room."

    elif "blue" in do:
        print "You entered the blue room."

    elif "green" in do:
        print "You entered the green room."

    elif "black" in do:
        print "You entered the black room."

    else:
        print "You sit patiently but slowly begin to stave.  You're running out of time."
        return whiteroom()

game = whiteroom()
game
</code>

(оригиналcodepad)

Я хотел бы вернуть класс whiteroom. Что либо невозможно, либо сделано неправильно. Если бы вы могли выяснить, как вернуть класс или как "ссылку" два класса вместе, так что whiteroom повторяется в else, а другие комнаты (которые будут классами) возвращаются при вызове, что было бы здорово.

Также я супер шаткий на__init__ и я до сих пор не совсем уверен, какова его цель. Все продолжают говорить мне, что это «инициализирует», что я уверен, что это делает, но это, похоже, не помогает моему мозгу.

Ваш Ответ

5   ответов
2

Извините, что сказал это, но это едва ли можно спасти.

Из того, что я могу сказать, вы хотите что-то вроде класса комнаты, например:

class Room(object):
    ''' A generic room '''
    def __init__(self):
        self.choices = None
        self.enter()
    def enter(self):
        ''' Enter the room, to be filled out in subclass '''
        pass
    def print_choices(self):
        '''You are stuck bro'''
        print "You are stuck bro"

Тогда вы можете создать определенную комнату, например, белую комнату, вот так:

class Whiteroom(Room):
    ''' A white room '''
    def __init__(self):
        self.choices = ["red", "blue", "green", "black"]
        self.enter()
    def enter(self):
        print "You sit patiently, but slowly begin to starve.  You're running out of time."
    def print_choices(self):
        print "You can choose from the following rooms:"
        print self.choices

class Blackroom(Room):
    ''' A black room '''
    def enter(self):
        print "It's really dark in here.  You're out of time."

class Redroom(Room):
    ''' A red room '''
    def __init__(self):
        self.choices = ["black", "blue", "green", "white"]
        self.enter()
    def enter(self):
        print "It's getting hot in here.  So take off all your clothes."
    def print_choices(self):
        print "You can choose from the following rooms:"
        print self.choices

class Blueroom(Room):
    ''' A blue room '''
    def __init__(self):
        self.choices = ["black", "red", "green", "white"]
        self.enter()
    def enter(self):
        print "It's nice and cool in here.  Stay awhile if you want."
    def print_choices(self):
        print "You can choose from the following rooms:"
        print self.choices

class Greenroom(Room):
    ''' A green room '''
    def __init__(self):
        self.choices = ["black", "red", "blue", "white"]
        self.enter()
    def enter(self):
        print "You won."

Затем вы должны сделать это, чтобы запустить игру:

print "Type 'quit' to quit"
print "Type 'choices' to see what your choices are"

current_room = Whiteroom()
done = False
while (not done):
    entry = raw_input("> ")
    if entry == "quit":
        done = True
    if "choices" in entry:
        current_room.print_choices()
    if current_room.choices:
        if entry in current_room.choices:    
            if "white" in entry:
                current_room = Whiteroom()

            if "black" in entry:
                current_room = Blackroom()

            if "red" in entry:
                current_room = Redroom()

            if "green" in entry:
                current_room = Greenroom()
                done = True

            if "blue" in entry:
                current_room = Blueroom()

Это моя лучшая попытка превратить ваш фрагмент в настоящую игру, используя классы.

2

Изучение Python Марка Лутца, Это всеобъемлющий источник для понимания концепций Python, особенно для кодированияPythonic путь.

Для вашей онлайн-справки мне нравятся учебники изэтот сайт. Пройти через этосообщение, это поможет вам с init. ООП в Python очень легко понять и реализовать. Сначала это кажется пугающим, но после программирования некоторых базовых кодов ООП это просто. Приятного обучения ..

42

вы взяли функцию и просто изменилиdef вclass, я думаю чтоmostly работает в вашем случае, но это не так, как классы должны идти.

Классы содержат функции (методы) и данные. Например, у вас есть мяч:

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
Application

Мяч аккуратный и все такое, но большинство людей не имитируют это. Вы делаете игру. Давайте подумаем о том, что у нас есть:

A room is the most obvious thing we could have.

Итак, давайте сделаем комнату. Номера имеют имена, поэтому у нас будет несколько данных для хранения, которые:

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'

Spiffy. Это оказывается не очень полезным, если вы хотите, чтобы разные комнаты имели разную функциональность, поэтому давайте сделаемsubclass,subclass наследует всю функциональность от егоsuperclass, но вы можете добавить больше функциональности или переопределить функциональность суперкласса.

Давайте подумаем, что мы хотим сделать с комнатами:

We want to interact with rooms.

И как мы это делаем?

The user types in a line of text that gets responded to.

То, как он отвечает, зависит от комнаты, поэтому давайте сделаем так, чтобы комната управляла этим с помощью метода, называемого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 Давайте также создадим красную комнату.

1. There's better options besides global variables here, but I'm going to use one for simplicity.

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'

Exercise for the reader: Добавить код вWhiteRoom& APOS; sinteract это позволяет вам вернуться в красную комнату.

Теперь, когда у нас все работает, давайте соберем все это вместе. С нашим новым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()

И это основное введение в классы и как применять его в вашей ситуации.

Error: User Rate Limit Exceeded Colton Allen
Error: User Rate Limit Exceeded Colton Allen
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededshouldError: User Rate Limit Exceeded
Error: User Rate Limit ExceededBallError: User Rate Limit Exceeded__init__Error: User Rate Limit Exceededfunctools.partialError: User Rate Limit ExceededshouldError: User Rate Limit Exceeded
1

объектно-ориентированное программирование может быть очень интересным, единственный способ по-настоящему разобраться в нем - это потратить время на то, чтобы много читать и практиковаться. Хорошее место для начала было бы здесь.http://www.voidspace.org.uk/python/articles/OOP.shtml а такжеhttp://wiki.python.org/moin/BeginnersGuide/Programmers

5

Классы - это способ сгруппировать набор функций и переменных в один объект. Когда вы дошли до этого, это просто способ организовать все в группы, которые имеют смысл. В будущем есть ряд преимуществ для облегчения понимания, отладки, расширения или поддержки, но в основном это просто способ сделать что-то более определенное в вашей ментальной модели.

Ваш код выглядит так, как будто вы пытаетесь написать всю свою программу внутри «объекта»; (действительно, у вас просто неправильно написана функция).

Рассмотрим это вместо этого.

Подумайте о своей ментальной модели комнат, в которых есть двери и доски. Двери имеют цвет. Также на досках может быть написано немного текста. Мы оставим это для простоты.

Для меня это предполагает 3 различных объекта - объект двери, у которого есть строка для цвета, объект доски, у которого есть строка для текста, и объект комнаты, у которого есть дверь и доска.

Рассмотрим следующий код:

class Door(object):
    def __init__(self, color):
        self.color = color

class Whiteboard(object):
    def __init__(self, default_text=''):
        self.text = ''
        self.write_text(default_text)

    def write_text(self, text):
        self.text += text

    def erase(self):
        self.text = ''


class Room(object):
    def __init__(self, doorcolor, whiteboardtext=''):
        self.whiteboard = Whiteboard(whiteboardtext)
        self.door = Door(doorcolor)




# make a room with a red door and no text on the whiteboard
room1 = Room('red')

# make a room with a blue door and 'yeah, whiteboard' on the whiteboard
room2 = Room('blue', 'yeah, whiteboard')

# make a room with a green door
room3 = Room('green')



# now I can play around with my 'rooms' and they keep track of everything internally

print 'room 1 door color: ' + room1.door.color
print 'room 2 door color: ' + room2.door.color


# all my rooms have a door and a whiteboard, but each one is different and self contained. For example
# if I write on room 1's whiteboard, it doesn't change anything about room 3s

print 'room1 whiteboard: ' + room1.whiteboard.text
print 'room2 whiteboard: ' + room2.whiteboard.text
print 'room3 whiteboard: ' + room3.whiteboard.text

print '-- changeing room 1 whiteboard text --'

room1.whiteboard.write_text('oop is really helpful')


print 'room1 whiteboard: ' + room1.whiteboard.text
print 'room2 whiteboard: ' + room2.whiteboard.text
print 'room3 whiteboard: ' + room3.whiteboard.text

init функция - это то, что вызывается, когда вы «инициализируете» новый экземпляр вашего класса. В этом примере я создаю 3 объекта Room, каждый из которых создает объект Door и Whiteboard внутри. Параметры, которые я передаю в конструкторRoom(parameter1, parameter2) попасть вinit функции - вы можете видеть, что я использую это, чтобы установить цвет двери и, возможно, некоторый текст на доске. Также обратите внимание, что переменные, которые "принадлежат" на объекты ссылаются сself - эта ссылка - то, что передается в качестве первого параметра всем функциям класса (и становится более важным позже, когда вы расширяете классы и другие более сложные вещи).

Похожие вопросы