Что __init__ и self делают на Python?

Scala возвращает тип Unit, а не тип назначаемого значения, с оператором присваивания. Поэтому

numRead = in.read(buffer)

never возвращает -1; он даже не возвращает целое число. Вы можете написать

while( { numRead = in.read(buffer); numRead != -1 } ) out.write(buffer, 0, numRead)

, или вы можете перейти к более функциональному стилю с помощью

Iterator.continually(in.read(buffer)).takeWhile(_ != -1).foreach(n => out.write(buffer,0,n))

Лично я предпочитаю первый, поскольку он короче (и меньше полагается на оценку итератора путь «он должен»).

692
задан ivanleoncz 11 June 2019 в 21:28
поделиться

6 ответов

'Сам' ссылка на экземпляр класса

class foo:
    def bar(self):
            print "hi"

Теперь, мы можем создать экземпляр нечто и назвать метод на нем, сам, параметр добавляется Python в этом случае:

f = foo()
f.bar()

, Но это может быть передано в также, если вызов метода не находится в контексте экземпляра класса, код ниже делает то же самое

f = foo()
foo.bar(f)

Интересно, имя переменной 'сам' является просто конвенцией. Ниже определения будет работать точно то же.. Сказав, что это очень сильная конвенция , которая должна сопровождаться всегда , но это действительно говорит что-то о гибкой природе языка

class foo:
    def bar(s):
            print "hi"
12
ответ дан tarn 12 June 2019 в 07:28
поделиться

В этом коде:

class A(object):
    def __init__(self):
        self.x = 'Hello'

    def method_a(self, foo):
        print self.x + ' ' + foo

... self переменная представляет экземпляр самого объекта. Большинство объектно-ориентированных языков передает это как скрытый параметр к методам, определенным на объекте; Python не делает. Необходимо объявить это явно. Когда Вы создадите экземпляр A класс и назовете его методы, он будет передан автоматически, как в...

a = A()               # We do not pass any argument to the __init__ method
a.method_a('Sailor!') # We only pass a single argument

__init__ метод примерно, что представляет конструктора в Python. Когда Вы звоните A(), Python создает объект для Вас и передает его как первый параметр к __init__ метод. Любые дополнительные параметры (например, A(24, 'Hello')) будут также переданы как аргументы - в этом случае, заставляющем исключение быть повышенным, так как конструктор не ожидает их.

540
ответ дан Chris B. 12 June 2019 в 07:28
поделиться

обратите внимание, что self мог на самом деле быть любой допустимый идентификатор Python. Например, мы могли столь же легко записать от примера B Chris:

class A(object):
    def __init__(foo):
        foo.x = 'Hello'

    def method_a(bar, foo):
        print bar.x + ' ' + foo

и это работало бы точно то же. Однако рекомендуется использовать сам, потому что другой pythoners распознает его более легко.

17
ответ дан SingleNegationElimination 12 June 2019 в 07:28
поделиться
  • 1
    Если that' s случай, тогда у Вас могло быть 2 различных bussonts с различными именами как @powerbuoy, предложил. Тогда регистрация сценария PHP, какая кнопка была отправлена. – Dr. Dan 13 August 2012 в 07:04

Короче говоря:

  1. self, как это предполагает, относится к само - объект, который назвал метод. Таким образом, если у Вас будут объекты N, называя метод, тогда self.a будет относиться к отдельному экземпляру переменной для каждого из объектов N. Предположите, что копии N переменной a для каждого объекта
  2. __init__ - то, что называют как конструктор на других языках ООП, таких как C++ / Java. Основная идея состоит в том, что это особенное метод, который автоматически называют когда, объект которого Класс создается
40
ответ дан Acumenus 12 June 2019 в 07:28
поделиться
  • 1
    Обмен потоками won' t помогите с масштабируемостью, но посмотрите пример загрузки. Несколько потоков могли бы быть в состоянии подать много асинхронных соединений. Если запрос может быть разбит в несколько задач, которые могут быть поставлены в очередь и такой, это могло бы стоить того для рассмотрения этого режима. Иначе, действительно, нет очень ожидаемых преимуществ. – Arjan Tijms 20 December 2012 в 00:26

Да, Вы правы, это конструкции ООП.

__init__ конструктор для класса. self параметр относится к экземпляру объекта (как this в C++).

class Point:
    def __init__(self, x, y):
        self._x = x
        self._y = y

__init__ метод называют, когда память для объекта выделяется:

x = Point(1,2)

важно использовать self параметр в методе объекта, если Вы хотите сохранить значение с объектом. Если, например, Вы реализуете __init__ метод как это:

class Point:
    def __init__(self, x, y):
        _x = x
        _y = y

Ваш x и y параметры были бы сохранены в переменных на стеке и будут отброшены, когда init метод выходит из объема. Установка тех переменных как [1 111] и self._y наборы те переменные как члены Point объект (доступный в течение времени жизни объекта).

228
ответ дан Augustin 12 June 2019 в 07:28
поделиться

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

28
ответ дан SilentGhost 12 June 2019 в 07:28
поделиться
  • 1
    Я don' t полностью понимают, как перемещение одного потока от одного пула до другого может иметь значение с точки зрения масштабируемости. Я вижу точку в возврате потока слушателя сервера к пулу, но мне don' t действительно знают, может ли это улучшить Вашу масштабируемость приложения много. – Guido 19 December 2012 в 20:47
Другие вопросы по тегам:

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