Назначение __init__ - PullRequest
       4

Назначение __init__

4 голосов
/ 17 февраля 2012

Я немного прочитал и не могу понять это так полно, как хотел бы.Я создаю небольшую игру «выбери свое приключение» из учебника LPTHW, вот полный сценарий: http://codepad.org/YWVUlHnU

Что я не понимаю, так это:

class Game(object):

    def __init__(self, start):
        self.quips = [
            "You died. Please try again.",
            "You lost, better luck next time.",
            "Things didn't work out well. You'll need to start over."
            "You might need to improve your skills. Try again." 
        ]
        self.start = start

Я понял, что мы создаем класс, но зачем определять __init__?Позже я делаю что-то вроде print self.quis[randint(0, len(self.quips)-1)], которое печатает одну из четырех строк в quips, но почему бы мне просто не создать функцию с именем quips или что-то еще?

Ответы [ 3 ]

15 голосов
/ 17 февраля 2012

Когда вы вызываете Game("central_corridor"), создается новый объект, и вызывается метод Game.__init__() с этим новым объектом в качестве первого аргумента (self) и "central_corridor" в качестве второго аргумента. Поскольку вы написали a_game = Game(...), вы назначили a_game для ссылки на этот новый объект.

Этот рисунок может облегчить понимание процесса:

Python object creation

Примечание: метод __new__ предоставляется Python. Создает новый объект класса, указанный в качестве первого аргумента. Встроенный метод __new__ ничего не делает с остальными аргументами. При необходимости вы можете переопределить метод __new__ и использовать другие аргументы.

Практическая причина наличия __init__() в вашей программе - установить атрибут start в экземпляре Game, который вы создаете (тот, который вы вызываете a_game), чтобы первый вызов a_game.play() начинался в место, где вы хотите.

Ты прав насчет quips. Нет никаких оснований для установки quips в __init__(). Вы можете просто сделать его атрибутом класса:

class Game(object):
    quips = ["You died. Please try again.",
            "You lost, better luck next time.",
            "Things didn't work out well. You'll need to start over."
            "You might need to improve your skills. Try again." ]
    def __init__(self, start):
        self.start = start
5 голосов
/ 17 февраля 2012

В более широком смысле __init__ и менее известные и часто более опасные __new__ методы класса Python предназначены для инициализации состояния вашего объекта.

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

Кроме того, главная причина состоит в том, чтобы сделать ваш класс многофункциональным:

class Foo(object):
    def __init__(self, word_of_power="Ni"):
        self.fact = "We are the knights who say %!" % word_of_power

>>> f = Foo()
>>> w = Foo("No!")
>>> print f.fact
"We are the knights who say Ni!"
>>> print w.fact
"We are the knights who say No!"
1 голос
/ 17 февраля 2012

__init__ работает здесь как конструктор. Поэтому, когда создается экземпляр игры, вызывается метод __init__. Если вы определите другой метод для установки quips , вам придется вызвать его явно.

...