В этом коде:
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')
) также будут переданы в качестве аргументов - в этом случае вызывается исключение, так как конструктор их не ожидает.
x = 'Hello'
вне init, но внутри класса? это как Java, где это то же самое, или это становится как статическая переменная, которая инициализируется только один раз?A.x
илиa.x
. Обратите внимание , что перекрывая его на определенный класс не повлияет на базу, такA.x = 'foo'; a.x = 'bar'; print a.x; print A.x
будет печататьbar
затемfoo
self
, это просто условно.object
в объявлении класса? Я заметил, что некоторые классы имеют это, а некоторые нетobject
потому что это происходит по умолчанию.Да, вы правы, это неоправданные конструкции.
__init__
является конструктором для класса.self
Параметр относится к экземпляру объекта (например ,this
в C ++).__init__
Метод вызывается , когда память для объекта выделяется:Важно использовать
self
параметр внутри метода объекта, если вы хотите сохранить значение в объекте. Если, например, вы реализуете__init__
метод следующим образом:Ваши
x
иy
параметры будут сохранены в переменных в стеке и будут отброшены , когда метод инициализации выходит из области видимости. Установка этих переменных какself._x
иself._y
устанавливает эти переменные в качестве членовPoint
объекта (доступны для жизни объекта).источник
self
бы быть в конструкторе? Почему вы даже должны указывать это, не лучше ли было бы это неявно?Краткий иллюстративный пример
В надежде, что это немного поможет, вот простой пример, который я использовал, чтобы понять разницу между переменной, объявленной внутри класса, и переменной, объявленной внутри
__init__
функции:Вывод:
источник
__init__
передается экземплярам класса, а не «статическая» переменная самого класса с тем же именем ...Короче говоря:
self
как это предполагает, относится к себе - объект, который вызвал метод. То есть, если у вас есть N объектов, вызывающих метод, тоself.a
будет ссылаться на отдельный экземпляр переменной для каждого из N объектов. Представьте N копий переменнойa
для каждого объекта__init__
это то, что называется конструктором в других языках ООП, таких как C ++ / Java. Основная идея заключается в том, что это специальный метод, который автоматически вызывается при создании объекта этого класса.источник
__init__
действует как конструктор. Вам нужно будет передать «self» любым функциям класса в качестве первого аргумента, если вы хотите, чтобы они вели себя как нестатические методы. «self» - это переменные экземпляра для вашего класса.источник
Попробуйте этот код. Надеюсь, это поможет многим программистам на Си, таким как я, освоить Py.
Вывод:
Jay
Sum = 5
Doc - Inside Class
Doc - __init__ Constructor
Doc - Inside Show
Destructor Deleting object - Jay
источник
Объекты класса поддерживают два вида операций: ссылки на атрибуты и создание экземпляров.
Ссылки на атрибуты используют стандартный синтаксис, используемый для всех ссылок на атрибуты в Python: obj.name. Допустимые имена атрибутов - это все имена, которые были в пространстве имен класса при создании объекта класса. Итак, если определение класса выглядело так:
затем
MyClass.i
иMyClass.f
являются действительными ссылками на атрибуты, возвращая целое число и объект функции, соответственно. Атрибуты класса также могут быть назначены, так что вы можете изменить значениеMyClass.i
присваивания.__doc__
также является допустимым атрибутом, возвращающим строку документации, принадлежащую классу: «Простой пример класса».Реализация класса использует функцию обозначения. Просто представьте, что объект класса является функцией без параметров, которая возвращает новый экземпляр класса. Например:
Операция создания экземпляра («вызов» объекта класса) создает пустой объект. Многие классы любят создавать объекты с экземплярами, настроенными на конкретное начальное состояние. Поэтому класс может определять специальный метод с именем
__init__()
, например:Когда класс определяет
__init__()
метод, создание экземпляра класса автоматически вызывается__init__()
для вновь созданного экземпляра класса. Таким образом, в этом примере новый инициализированный экземпляр можно получить:Конечно,
__init__()
метод может иметь аргументы для большей гибкости. В этом случае аргументы, данные оператору создания класса, передаются в__init__()
. Например,Взято из официальной документации, которая мне больше всего помогла в итоге.
Вот мой пример
Когда вы создаете экземпляр класса Bill:
Ты получаешь:
источник
У меня были проблемы с пониманием этого. Даже после прочтения ответов здесь.
Чтобы правильно понять
__init__
метод, вам нужно понять себя.Параметр собственной личности
Аргументы, принятые
__init__
методом:Но мы только фактически передаем ему два аргумента:
Откуда взялись дополнительные аргументы?
Когда мы получаем доступ к атрибутам объекта, мы делаем это по имени (или по ссылке). Здесь экземпляр является ссылкой на наш новый объект. Мы обращаемся к методу printargs объекта instance, используя instance.printargs.
Чтобы получить доступ к атрибутам объекта из
__init__
метода, нам нужна ссылка на объект.Каждый раз, когда вызывается метод, в качестве первого аргумента передается ссылка на главный объект. По соглашению вы всегда вызываете этот первый аргумент для своих методов self.
Это означает, что в
__init__
методе мы можем сделать:Здесь мы устанавливаем атрибуты для объекта. Вы можете проверить это, выполнив следующие действия:
такие значения известны как атрибуты объекта. Здесь
__init__
метод устанавливает атрибуты arg1 и arg2 экземпляра.источник: http://www.voidspace.org.uk/python/articles/OOP.shtml#the-init-method
источник
обратите внимание, что это
self
может быть любой действительный идентификатор Python. Например, мы могли бы так же легко написать на примере Криса Б.и это будет работать точно так же. Однако рекомендуется использовать self, потому что другие питонеры распознают его легче.
источник
По сути, вам нужно использовать ключевое слово «self» при использовании переменной в нескольких функциях в одном классе. Что касается init , он используется для установки значений по умолчанию, если никакие другие функции из этого класса не вызываются.
источник
__init__
в основном это функция, которая будет «инициализировать» / «активировать» свойства класса для конкретного объекта, после того как он создан и сопоставлен с соответствующим классом.self
представляет тот объект, который будет наследовать эти свойства.источник
«Я» является ссылкой на экземпляр класса
Теперь мы можем создать экземпляр foo и вызвать для него метод, в этом случае Python добавляет параметр self:
Но это также может быть передано, если вызов метода не в контексте экземпляра класса, код ниже делает то же самое
Интересно, что имя переменной «self» - это просто соглашение. Приведенное ниже определение будет работать точно так же. Сказав, что это очень строгое соглашение, которому следует всегда следовать , но оно действительно говорит о гибкой природе языка.
источник
s
), демонстрирует гибкость Python.Просто демо на вопрос.
источник
В этом коде:
Здесь
__init__
действует как конструктор для класса, и когда создается объект, вызывается эта функция.self
представляет экземпляр объектаРезультат вышеприведенных утверждений будет следующим:
источник
Первый аргумент каждого метода класса, включая init, всегда является ссылкой на текущий экземпляр класса . По соглашению этот аргумент всегда называется
self
. В методе initself
ссылается на вновь созданный объект; в других методах класса он ссылается на экземпляр, метод которого был вызван.Python не заставляет вас использовать « себя ». Вы можете дать ему любое имя. Но помните, что первый аргумент в определении метода - это ссылка на объект . Python добавляет
self
аргумент в список для вас; вам не нужно включать его при вызове методов. если вы не указали self в методе init, вы получите ошибкуinit
коротка для инициализации. Это конструктор, который вызывается, когда вы создаете экземпляр класса, и в этом нет необходимости . Но обычно мы пишем метод init для установки состояния объекта по умолчанию. Если вы не желаете изначально устанавливать какое-либо состояние объекта, вам не нужно писать этот метод.источник
источник
Приведенный пример неверен, поэтому позвольте мне создать правильный пример на его основе:
Когда мы создаем экземпляр объекта,
__init__
вызывается для настройки объекта после того, как он был создан. То есть, когда мы называемSomeObject
с'blah'
ниже (который может быть что угодно), она будет передана в__init__
функцию в качестве аргументаblah
:self
Аргумент является экземпляр ,SomeObject
который будет назначенan_object
.Позже мы можем захотеть вызвать метод для этого объекта:
Делаем точечный поиск, то есть
an_object.method
привязка экземпляра к экземпляру функции, и метод (как вызывается выше) теперь является «связанным» методом - это означает, что нам не нужно явно передавать экземпляр в вызов метода ,Вызов метода получает экземпляр, поскольку он был связан с точечным поиском, а при вызове выполняет любой код, который был запрограммирован для выполнения.
Неявно переданный
self
аргумент называетсяself
по соглашению. Мы могли бы использовать любое другое допустимое имя Python, но другие программисты Python, скорее всего, получат смолу и перья, если вы измените его на что-то другое.__init__
это специальный метод, описанный в документации по Python datamodel . Он вызывается сразу после создания экземпляра (обычно через__new__
- хотя__new__
это и не требуется, если вы не наследуете неизменяемый тип данных).источник
Здесь парень написал довольно хорошо и просто: https://www.jeffknupp.com/blog/2014/06/18/improve-your-python-python-classes-and-object-oriented-programming/
Прочитайте ссылку выше как ссылку на это:
источник