Комментарии 35
мне кто-нибудь расскажет, в чем сакральный смысл передачи self в каждый метод класса? вот изучаю язык, но этого догнать не могу… все кажется, что костыль какой-то…
по аналогии с другими языками ($this например)
чтобы можно было явно получить указатель на конкретный экземпляр класса
как-то так…
как-то так…
Для лучшего понимания происходящего. В питоне нет никакой магии в классах — вместо неочевидных магических директив static и public все делается конструкциями языка, такими как декораторы @staticmethod и @classmethod, которые тоже ведут себя в рамках языка. Т.е. вы сами можете написать такие-же, например как здесь.
Недавно в вопросы и ответы обращался человек который никак не мог понять, что происходит внутри ОПП. Когда я объяснил ему как выглядит ООП с точки зрения питона, он сразу понял. И судя по оценкам ответа, это объяснение показалось наиболее логичным не одному ему.
Недавно в вопросы и ответы обращался человек который никак не мог понять, что происходит внутри ОПП. Когда я объяснил ему как выглядит ООП с точки зрения питона, он сразу понял. И судя по оценкам ответа, это объяснение показалось наиболее логичным не одному ему.
Да, но зато есть «магические» приставки "_" и "__" перед названиями методов :)
А можно повторить?! А то, к сожалению уже не активно… Кто бы мог подумать каких-то 6 лет ))
В таких случаях иногда спасает wayback machine web.archive.org/web/20110218064229/http://habrahabr.ru/qa/4847/
>>> 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» этого же автора. В конце концов, никакой мистики не останется.
Все особенности языка замечательно и подробно описаны в книге «Learning Python» Марка Лутца. После её прочтения логично проработать «Programming Python» этого же автора. В конце концов, никакой мистики не останется.
Если я прафильно понимаю, то метод в питоне не более чем, аттрибут класса, который оказался объектом типа метод. Так что, вы вполне можете добавить к классу новый метод или скопировать из одного класса метод в другой. Чтобы, в таких ситуациях всё было очевидно, разработчики, видимо, решили не связывать метод с классом, которому он сейчас принадледжит, какими-то неявными механизмами, а передавать указатель в лоб, питом же стремится к ясности, пусть и в ущерб красоте.
Отличная статья, спасибо.
Только сейчас понял что за тип type. :)
Только сейчас понял что за тип type. :)
>> Точно так же в рантайме к классу можно добавить метод
Что самое весёлое, в python даже функции модуля и методу класса можно добавить состояние
>>> def foo():
… return 'foo'
>>> foo()
'foo'
>>> foo.bar = 'bar'
>>> foo.bar
'bar'
>>> foo
<function foo at 0xb77f0224>
>>> foo.__dict__
{'bar': 'bar'}
Что самое весёлое, в 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 раза в день после еды.
Про «правила форматирования» не совсем понял. Имеете ввиду отбивку знака равенства? Сам не знаю.
А вообще… www.python.org/dev/peps/pep-0008 2 раза в день после еды.
Это не «лень» называется. В том-то и дело, что отличий не так много, а портирование большой библиотеки на python 3 может быть очень нетривиальной задачей. Поэтому этим мало кто хочет заниматься — других задач и так куча, а тут, получается, вместо решения практических проблем тратить кучу сил, ломать совместимость (или внезапно начинать поддерживать несколько параллельных версий кода) — и все без особой практической выгоды.
Когда python 3 делали, это все прекрасно понимали. Изначально план был, что лет за 5 третья версия критическую массу наберет и вторую заменять начнет, так примерно все и идет.
Недавно еще wsgi тормозом был, сейчас вроде получше. А джангу Alex Gaynor летом собирается на py3k портировать.
Когда python 3 делали, это все прекрасно понимали. Изначально план был, что лет за 5 третья версия критическую массу наберет и вторую заменять начнет, так примерно все и идет.
Недавно еще wsgi тормозом был, сейчас вроде получше. А джангу Alex Gaynor летом собирается на py3k портировать.
Вы просто необычайно вовремя со своим циклом статей о ООП в пайтоне! Как раз заинтересовался этим необычным языком программирования и примерно сейчас взялся за ООП в нём.
Всё-таки я совершенно искренне огорчаюсь, что из-за правил Хабрахабра, человек с нулевой кармой не может высказать свою «материальную» благодарность автору, чьё изложение нужной темы в нужное время так помогло!
Позвольте, хотя бы на словах, от всего сердца поблагодарить Вас за этот цикл тем!
Всё-таки я совершенно искренне огорчаюсь, что из-за правил Хабрахабра, человек с нулевой кармой не может высказать свою «материальную» благодарность автору, чьё изложение нужной темы в нужное время так помогло!
Позвольте, хотя бы на словах, от всего сердца поблагодарить Вас за этот цикл тем!
Столько плюсов статье и ни одного кмментария. Исправлю ситуацию.
Автору спасибо :) Видно, что он потратил кучу времени на эти статьи.
Автору спасибо :) Видно, что он потратил кучу времени на эти статьи.
Тип и класс — это разные названия одного и того же.Не вызывает доверия это утверждение что-то…
> Не вызывает доверия это утверждение что-то…
Ну собственно, чтобы сделать типы похожими на классы, а точнее все свести к одному, и были введены new-style classes, для которых это так и есть.
Ну собственно, чтобы сделать типы похожими на классы, а точнее все свести к одному, и были введены 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__).»
«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__).»
Спасибо тебе добрый человек! Отличная статья, многое из подсознательного выбралось в сознательное.
Отличная статья, только ссылки на остальные части не работают, поправьте пожалуйста.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Заметки об объектной системе языка Python ч.1