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))
Лично я предпочитаю первый, поскольку он короче (и меньше полагается на оценку итератора путь «он должен»).
'Сам' ссылка на экземпляр класса
class foo:
def bar(self):
print "hi"
Теперь, мы можем создать экземпляр нечто и назвать метод на нем, сам, параметр добавляется Python в этом случае:
f = foo()
f.bar()
, Но это может быть передано в также, если вызов метода не находится в контексте экземпляра класса, код ниже делает то же самое
f = foo()
foo.bar(f)
Интересно, имя переменной 'сам' является просто конвенцией. Ниже определения будет работать точно то же.. Сказав, что это очень сильная конвенция , которая должна сопровождаться всегда , но это действительно говорит что-то о гибкой природе языка
class foo:
def bar(s):
print "hi"
В этом коде:
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')
) будут также переданы как аргументы - в этом случае, заставляющем исключение быть повышенным, так как конструктор не ожидает их.
обратите внимание, что self
мог на самом деле быть любой допустимый идентификатор Python. Например, мы могли столь же легко записать от примера B Chris:
class A(object):
def __init__(foo):
foo.x = 'Hello'
def method_a(bar, foo):
print bar.x + ' ' + foo
и это работало бы точно то же. Однако рекомендуется использовать сам, потому что другой pythoners распознает его более легко.
Короче говоря:
self
, как это предполагает, относится к само - объект, который назвал метод. Таким образом, если у Вас будут объекты N, называя метод, тогда self.a
будет относиться к отдельному экземпляру переменной для каждого из объектов N. Предположите, что копии N переменной a
для каждого объекта __init__
- то, что называют как конструктор на других языках ООП, таких как C++ / Java. Основная идея состоит в том, что это особенное метод, который автоматически называют когда, объект которого Класс создается Да, Вы правы, это конструкции ООП.
__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
объект (доступный в течение времени жизни объекта).
__init__
совершает поступок как конструктор. Необходимо будет передать "сам" любым функциям класса как первый аргумент, если Вы захотите, чтобы они вели себя как нестатические методы. "сам" переменные экземпляра для Вашего класса.