Latest posts on В чём тайный смысл в передаче методу класса self? topichttps://python.su/forum/topic/862/2019-10-20T09:14:21+03:00Общий :: Python для экспертов :: В чём тайный смысл в передаче методу класса self?
2019-10-20T09:14:21+03:00id626249205080та же проблема была, спасибо<a href="http://ronwer.ru">!</a> <br/>
Общий :: Python для экспертов :: В чём тайный смысл в передаче методу класса self?
2007-06-09T03:15:01+03:00xonix5713<blockquote><em>Андрей Светлов</em><br/>Когда я писал свою простыню, она мне показалась и так достаточно длинной, чтобы приводить подобный пример. Поэтому я только упомянул о возможности динамического создания/изменения класса.<br/>По поводу встроенных классов: я не вижу необходимости дополнять str, а тем более object. Более того, считаю, что это очень опасно.</blockquote>Когда заходит речь на эту тему, я тоже иногда говорю подобные слова :), но, черт возьми, как иногда не хватает гибкости руби, смоллтолка, или хотя бы того же javascript'а.
Общий :: Python для экспертов :: В чём тайный смысл в передаче методу класса self?
2007-06-08T22:46:38+03:00Андрей Светлов5709Когда я писал свою простыню, она мне показалась и так достаточно длинной, чтобы приводить подобный пример. Поэтому я только упомянул о возможности динамического создания/изменения класса.<br/>По поводу встроенных классов: я не вижу необходимости дополнять str, а тем более object. Более того, считаю, что это очень опасно.<br/>А вот унаследоваться от str и начать наследуемый класс модифицировать “на лету” - очень полезно и всегда можно. Только не забывайте, что при работе с базовыми классам лучше использовать __new__ (от __init__ толку почти никакого). И унаследованный класс можно использовать везде, где требуется семантика str.
Общий :: Python для экспертов :: В чём тайный смысл в передаче методу класса self?
2007-06-08T17:49:42+03:00xonix5703<div class="code"><pre><span class="o">>>></span> <span class="k">class</span> <span class="nc">A</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="k">pass</span>
<span class="o">>>></span> <span class="n">a</span> <span class="o">=</span> <span class="n">A</span><span class="p">();</span> <span class="n">a</span><span class="o">.</span><span class="n">p</span><span class="p">()</span>
<span class="n">Traceback</span> <span class="p">(</span><span class="n">most</span> <span class="n">recent</span> <span class="n">call</span> <span class="n">last</span><span class="p">):</span>
<span class="n">File</span> <span class="s">"<pyshell#4>"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">1</span><span class="p">,</span> <span class="ow">in</span> <span class="o"><</span><span class="n">module</span><span class="o">></span>
<span class="n">a</span> <span class="o">=</span> <span class="n">A</span><span class="p">();</span> <span class="n">a</span><span class="o">.</span><span class="n">p</span><span class="p">()</span>
<span class="ne">AttributeError</span><span class="p">:</span> <span class="s">'A'</span> <span class="nb">object</span> <span class="n">has</span> <span class="n">no</span> <span class="n">attribute</span> <span class="s">'p'</span>
<span class="o">>>></span> <span class="k">def</span> <span class="nf">p</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">print</span> <span class="bp">self</span><span class="o">.</span><span class="n">d</span>
<span class="o">>>></span> <span class="n">A</span><span class="o">.</span><span class="n">p</span> <span class="o">=</span> <span class="n">p</span><span class="p">;</span> <span class="n">a</span><span class="o">.</span><span class="n">d</span> <span class="o">=</span> <span class="s">'Hello world'</span>
<span class="o">>>></span> <span class="n">a</span><span class="o">.</span><span class="n">p</span><span class="p">()</span>
<span class="n">Hello</span> <span class="n">world</span>
<span class="o">>>></span> <span class="n">A</span><span class="o">.</span><span class="n">p</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
<span class="n">Hello</span> <span class="n">world</span>
<span class="o">>>></span>
</pre></div>Вот такой код промыслите. Как видите, можно классы на ходу дополнять методами, причем экземпляры автоматически обзаводятся этими же методами. Правда со встроенными классами(типами) (str, object, …) такой финт не прокатывает (( Вот где рулят руби и смоллтолк.
Общий :: Python для экспертов :: В чём тайный смысл в передаче методу класса self?
2007-06-07T18:33:24+03:00pento5689Всем спасибо за объяснения :)<br/><strong>Андрей Светлов</strong>, отдельное спасибо.<br/><br/>Вопрос был для меня закономерен, просто я первый раз такое встречаю. <br/>До этого в образце ООП для меня С++ такого я не встречал. Спасибо за понимание.
Общий :: Python для экспертов :: В чём тайный смысл в передаче методу класса self?
2007-06-07T14:28:51+03:00Андрей Светлов5686<blockquote><em>bialix</em><br/>Здесь мелкая неточность:<br/><br/>с bound method все немного сложнее:<br/>>>> af = a.f()<br/>>>> af<br/><bound method A.f of <__main__.A object at 0x00D9A2D0>><br/><br/>Должно быть<br/><br/>>>> af = a.f</blockquote>поправил
Общий :: Python для экспертов :: В чём тайный смысл в передаче методу класса self?
2007-06-07T14:18:45+03:00bialix5685Здесь мелкая неточность:<br/><br/>с bound method все немного сложнее:<br/>>>> af = a.f()<br/>>>> af<br/><bound method A.f of <__main__.A object at 0x00D9A2D0>><br/><br/>Должно быть<br/><br/>>>> af = a.f
Общий :: Python для экспертов :: В чём тайный смысл в передаче методу класса self?
2007-06-07T14:16:25+03:00bialix5684К цитируемому Zen of Python добавлю последнюю мантру:<br/><br/>Namespaces are one honking great idea – let's do more of those!
Общий :: Python для экспертов :: В чём тайный смысл в передаче методу класса self?
2007-06-07T12:57:24+03:00Андрей Светлов5683Флейм - не флейм…<br/>Я попытаюсь рассказать, как таки оно работает.<br/><br/>Когда пишем<br/>class A(object):<br/> def f(self):<br/> print ‘A.f’, self<br/><br/>Класс A создается метаклассом type(name, bases, attrs)<br/><br/>>>>def f(self):<br/>>>> print ‘A.f’, self<br/>>>> A = type('A'), (object,), {'f':f}) <br/><class ‘__main__’.A><br/>Все, что попадает в attrs - перечисленные внутри аттрибуты (функции и переменные класса). Когда type создает A, он проходит по словарю аттрибутов. Если элемент словаря - функция, то она вставляется через method дескриптор. Остальные аттрибуты не модифицируются.<br/><br/>Дескриптор - это специальный объект с методами __get__, __set__, __delete__. Для method descriptor достаточно __get__.<br/>Если method дескриптор вызывается с инстанцией класса - получается bound method, с классом - unbound method<br/>>>> a = A()<br/>>>> a.f()<br/>A.f <__main__.A object at 0x00D9A2D0><br/>>>> A.f<br/><unbound method A.f><br/>>>> <br/><br/>unbound method работает без сюрпризов, только всегда проверяет первый агумент на isinstance(<first argument>, A): <br/>>>> A.f()<br/>Traceback (most recent call last):<br/> File “<interactive input>”, line 1, in ?<br/>TypeError: unbound method f() must be called with A instance as first argument (got nothing instead)<br/>>>> A.f(a)<br/>A.f <__main__.A object at 0x00D9A2D0><br/>>>> <br/><br/>bound method немного сложнее:<br/>>>> af = a.f<br/>>>> af<br/><bound method A.f of <__main__.A object at 0x00D9A2D0>><br/>>>> af()<br/>A.f <__main__.A object at 0x00D9A2D0><br/>Т.е. он запоминает в себе a и при вызове добавляет его как первый параметр (обычно это self)<br/><br/>В итоге получаем - методы по сути обычные функции, завернутые через дескрипторы, чтобы казались методами.<br/>Помимо простоты и однозначности (def ВСЕГДА определяет свободную функцию), отсутствия необходимости в новом ключевом слове defmethod или серьезного усложнения обработки def, требующего знания о контекстах более высокого уровня (класса, модуля) мы с таким подходом еще и получаем очень гибкий механизм создания/изменения класса “на лету”.<br/><br/>С моей точки зрения, все вышеперечисленное вполне способно объяснить необходимость писать self. Вспомните еще про staticmethod, в котором self отсутствует, classmethod без self зато с cls - все они делаются через декораторы, создающие специализированные дескрипторы.<br/>В соседней теме <a href="http://python.com.ua/forum/viewtopic.php?id=837">finite state machine на Питоне</a> я приводил пример дескриптора, который выбирает реализацию функции основываясь на внутреннем состоянии. <br/><br/>Ну и конечно:<br/>Explicit is better than implicit.<br/>Simple is better than complex.<br/>Complex is better than complicated.<br/>Special cases aren't special enough to break the rules.
Общий :: Python для экспертов :: В чём тайный смысл в передаче методу класса self?
2007-06-07T10:29:20+03:00Maximbo5676Это уже явный флейм. Господа, желающие продолжения банкета, могут проследовать в <a href="http://www.python.com.ua/forum/viewforum.php?id=16">курилку</a>.
Общий :: Python для экспертов :: В чём тайный смысл в передаче методу класса self?
2007-06-07T09:03:15+03:00asv135673хорошо бы было от него избавиться<br/>а то запись формул в функциях внутри класса получается неудобной<br/>16e8 * self.Tres**(-2.8177) * log(self.API)**(5.7526 * log(self.Tres) - 26.9718)<br/>и от self-а начинает рябить в глазах
Общий :: Python для экспертов :: В чём тайный смысл в передаче методу класса self?
2007-06-07T08:59:51+03:00bialix5672<blockquote><em>pento</em><br/>Просто интересует логика рзработчиков языка..зачем каждый раз в методе класса передавать self?<br/>Почему нет аналога this-> ?<br/>Или может я просто не просёк всей фишки?<br/>Поясните, пжста.</blockquote>Еще один…<br/>Читайте про пространства имен в питоне. Потом подумайте еще раз над своим вопросом.<br/>Это не фишка – это дизайн языка.
Общий :: Python для экспертов :: В чём тайный смысл в передаче методу класса self?
2007-06-06T22:42:48+03:00tabajara5668<div class="code"><pre><span class="o">>>></span> <span class="kn">import</span> <span class="nn">this</span>
</pre></div>
Общий :: Python для экспертов :: В чём тайный смысл в передаче методу класса self?
2007-06-06T22:28:35+03:00Maximbo5667Возможно, “Явное лучше неявного” © ;)
Общий :: Python для экспертов :: В чём тайный смысл в передаче методу класса self?
2007-06-06T20:32:12+03:00pento5664Просто интересует логика рзработчиков языка..зачем каждый раз в методе класса передавать self?<br/>Почему нет аналога this-> ?<br/>Или может я просто не просёк всей фишки?<br/>Поясните, пжста.