Pull to refresh

Comments 35

мне кто-нибудь расскажет, в чем сакральный смысл передачи self в каждый метод класса? вот изучаю язык, но этого догнать не могу… все кажется, что костыль какой-то…
по аналогии с другими языками ($this например)
чтобы можно было явно получить указатель на конкретный экземпляр класса
как-то так…
Инициализированный класс! Причем конкретный экземпляр в памяти.
В __call__ он еще не инициирован.
Для лучшего понимания происходящего. В питоне нет никакой магии в классах — вместо неочевидных магических директив static и public все делается конструкциями языка, такими как декораторы @staticmethod и @classmethod, которые тоже ведут себя в рамках языка. Т.е. вы сами можете написать такие-же, например как здесь.

Недавно в вопросы и ответы обращался человек который никак не мог понять, что происходит внутри ОПП. Когда я объяснил ему как выглядит ООП с точки зрения питона, он сразу понял. И судя по оценкам ответа, это объяснение показалось наиболее логичным не одному ему.
Да, но зато есть «магические» приставки "_" и "__" перед названиями методов :)
Это просто соглашение. «Магические» методы могли бы называться как угодно.
Я образно :) К тому, что есть немного неочевидные вещи.
А можно повторить?! А то, к сожалению уже не активно… Кто бы мог подумать каких-то 6 лет ))
>>> import this
The Zen of Python, by Tim Peters
...
Explicit is better than implicit.


Если действительно хотите писать на этом прекрасном языке, изучите Дзен, хотя на это уйдёт не один день.
И на последок: artifex.org/~hblanks/talks/2011/pep20_by_example.html
self — это указатель на все существующие и будущие экземпляры класса. Он передаётся как атрибут метода класса (всегда и явно) и обозначает что-либо в отношении экземпляра описанного класса. Фактически, при объявлении «self.name = name», вы как бы подразумеваете «имя_экземпляра.name, значение которого равно name». Не знаю корректно ли это звучит в русской терминологии, так как учил (и учу) язык по хорошим английским книгам.

Все особенности языка замечательно и подробно описаны в книге «Learning Python» Марка Лутца. После её прочтения логично проработать «Programming Python» этого же автора. В конце концов, никакой мистики не останется.
Если я прафильно понимаю, то метод в питоне не более чем, аттрибут класса, который оказался объектом типа метод. Так что, вы вполне можете добавить к классу новый метод или скопировать из одного класса метод в другой. Чтобы, в таких ситуациях всё было очевидно, разработчики, видимо, решили не связывать метод с классом, которому он сейчас принадледжит, какими-то неявными механизмами, а передавать указатель в лоб, питом же стремится к ясности, пусть и в ущерб красоте.
Отличная статья, спасибо.
Только сейчас понял что за тип type. :)
Спасибо. Про type и object у меня отдельная заметка есть :)
Ээээ… А где? В вашем профиле только одна статья.
Сейчас дооформлю и опубликую.
>> Точно так же в рантайме к классу можно добавить метод

Что самое весёлое, в python даже функции модуля и методу класса можно добавить состояние

>>> def foo():
… return 'foo'

>>> foo()
'foo'

>>> foo.bar = 'bar'

>>> foo.bar
'bar'

>>> foo
<function foo at 0xb77f0224>

>>> foo.__dict__
{'bar': 'bar'}
У Вас там нехватает атрибута qux в классе B.
Хочу добавить, что начиная с Python 3, все классы изначально являются «new-style» и наследовать «object» не нужно.
Я думаю, пора уже писать статьи для третьей ветки или хотя бы с примечаниями для неё.

А ещё я никак не пойму сакральный смысл отступать от правил форматирования в укромных уголках кода типа:
self.name=name
Двойка, судя по всему, ещё несколько лет будет в строю. Хотя, казалось бы, уже достаточно времени прошло для перехода на тройку. Видимых отличий не так-то и много, скорее всего тормоз прогресса состоит в лени разработчиков. Django тот же всё никак не разродится, а жаль.

Про «правила форматирования» не совсем понял. Имеете ввиду отбивку знака равенства? Сам не знаю.

А вообще… www.python.org/dev/peps/pep-0008 2 раза в день после еды.
Это не «лень» называется. В том-то и дело, что отличий не так много, а портирование большой библиотеки на python 3 может быть очень нетривиальной задачей. Поэтому этим мало кто хочет заниматься — других задач и так куча, а тут, получается, вместо решения практических проблем тратить кучу сил, ломать совместимость (или внезапно начинать поддерживать несколько параллельных версий кода) — и все без особой практической выгоды.

Когда python 3 делали, это все прекрасно понимали. Изначально план был, что лет за 5 третья версия критическую массу наберет и вторую заменять начнет, так примерно все и идет.

Недавно еще wsgi тормозом был, сейчас вроде получше. А джангу Alex Gaynor летом собирается на py3k портировать.

Вы просто необычайно вовремя со своим циклом статей о ООП в пайтоне! Как раз заинтересовался этим необычным языком программирования и примерно сейчас взялся за ООП в нём.
Всё-таки я совершенно искренне огорчаюсь, что из-за правил Хабрахабра, человек с нулевой кармой не может высказать свою «материальную» благодарность автору, чьё изложение нужной темы в нужное время так помогло!
Позвольте, хотя бы на словах, от всего сердца поблагодарить Вас за этот цикл тем!
Спасибо. Рад стараться.
Столько плюсов статье и ни одного кмментария. Исправлю ситуацию.

Автору спасибо :) Видно, что он потратил кучу времени на эти статьи.
Как так? Матрица поимела меня :( Откуда вы все взялись только.
Тип и класс — это разные названия одного и того же.
Не вызывает доверия это утверждение что-то…
> Не вызывает доверия это утверждение что-то…

Ну собственно, чтобы сделать типы похожими на классы, а точнее все свести к одному, и были введены new-style classes, для которых это так и есть.

docs.python.org/reference/datamodel.html#new-style-and-classic-classes

«New-style classes were introduced in Python 2.2 to unify classes and types. A new-style class is neither more nor less than a user-defined type. If x is an instance of a new-style class, then type(x) is typically the same as x.__class__ (although this is not guaranteed — a new-style class instance is permitted to override the value returned for x.__class__).»
Спасибо тебе добрый человек! Отличная статья, многое из подсознательного выбралось в сознательное.
Отличная статья, только ссылки на остальные части не работают, поправьте пожалуйста.
Sign up to leave a comment.

Articles