передача собственных данных в python - PullRequest
0 голосов
/ 11 августа 2011

Не могли бы вы пояснить, как это self.add(x) ниже работает так же, как self.data.append(x)? То есть, как self.add(x) узнает, что добавить в список, потому что мы явно не указали self.data.add(x)? Когда мы заявляем y.addtwice('cat'), 'cat' добавляется к 'self', а не self.data.

class Bag:
    def __init__(self):
        self.data=[]
    def add(self,x):
        self.data.append(x)
        return self.data
    def addtwice(self,x):
        self.add(x)
        self.add(x)
        return self.data

>>> y = Bag()
>>> y.add('dog')
['dog']
>>> y.addtwice('cat')
['dog', 'cat', 'cat']

Ответы [ 5 ]

4 голосов
/ 11 августа 2011

Поскольку addtwice вызывает методы, которые определены для self, и поскольку self.data является "изменяемым типом", вызов addtwice для add приведет к добавлению значения self.data.add, в свою очередь вызывает self.data.append

Когда вы вызываете функцию в компьютерной программе, вы можете думать о процессе как о серии замен:

# -> means (substitution for)
# <= means "return"
y = Bag()
y.add('dog') -> 
     y.data.append(x) ->
         #(machine code)
     <= y.data
# at this point, at the command propmt, python will just print what was returned.
y.addtwice('cat')->
     y.add('cat')->
         y.data.append(x) ->
             #(machine code) 
         <= y.data
     #nothing cares about this return
     y.add('cat')->
         y.data.append(x) ->
             #(machine code)
         <= y.data
     #nothing cares about this return either
     <= y.data
# at this point, at the command propmt, python will just print what was returned.

self само по себе никогда не добавляется ни в одном из этих случаев.self.data есть.

1 голос
/ 11 августа 2011

add(self, x) - это просто функция, которую вы хотите вызвать.

append - это встроенная функция, которая добавляет элемент в список.

так что ваша функция добавления в основном использует append для добавления нужного элемента в список и возврата списка, который вы назвали data

self.addtwice будет вызывать self.add ровно два раза и поэтому добавит элемент дважды.

1 голос
/ 11 августа 2011

Давайте посмотрим на функцию add(self, x) из класса Bag.

Когда вызывается эта функция, одним из параметров является self, которым является сам объект, в данном случае это тот же экземпляр Bag, чья функция add вызывается.

Следовательно, в функции add вызов self.data.append(x) - это, по сути, вызов функции, добавляемой в data список Bag, таким образом добавляя элемент x в список.

То же самое для функции addtwice. При двойном вызове функции add два элемента добавляются в список data Bag.

Обе функции возвращают список data.

1 голос
/ 11 августа 2011

Когда мы заявляем y.addtwice ('cat'), к 'self' добавляется 'cat', а не self.data

Это неверно.cat фактически добавляется к self.data.Почему вы думаете, что он был добавлен к self?

y.add('dog') - это то же самое, что и Bag.add(y, 'dog').Так что add действительно выполняет y.data.append('dog'), вместо него принято использовать имя self.

y.addtwice('cat') - это то же самое, что и Bag.addtwice(y, 'cat').Так что addtwice действительно делает y.add('cat') дважды, что аналогично Bag.add(y, 'cat') дважды.Таким образом, addtwice действительно выполняет y.data.append('cat') дважды.

self в каждом методе экземпляра - это просто автоматически добавляемая переменная, указывающая на экземпляр , который она называетсяв этом случае y.

1 голос
/ 11 августа 2011

self.add(x) вызывает метод экземпляра add, который в свою очередь вызывает self.data.append(x)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...