Python + self = ? (original) (raw)

March 19 2010, 10:13

Categories:

Начну издалека. После того, как я изучил венец эволюции языков программирования по теории тов. Вирта -- язык Oberon, я смог однозначно ответить для себя на вопрос: сколько фич надо добавить в старый добрый си, чтобы на нем можно было более-менее сносно программировать в объектно-ориентированном стиле.
Знающие Oberon наверняка догадались -- ровно одну. Наследование структур.

Понятно, что когда "Великий Диктатор" Гвидо вводил объектную модель в питон, было грех не воспользоваться уже готовой реализацией модулей, как неким пространством-словарем. Единственная загвоздка -- методы, которые должны содержать явный или неявный указатель на экземпляр класса, плюс особый режим разрешения видимости переменных внутри них.
Если быть предельно ленивым, и пытаться решить вопрос малой кровью -- self очевидное решение. Оно действительно упрощает и реализацию, и описание языка в том плане, что не надо различать указатель на функцию и указатель на метод (к которому опционально может быть подвязан указатель на экземпляр).

Главным моментом в критике self, как явления, считается тот факт, что пользователей языка сбивает количественное несоответствие параметров: при вызове метода параметров всегда выходит на один меньше.

Как по мне, главная проблема все-таки не в этом. Главное -- нарушение логики поиска имен. Если представить себе, что класс, это такая же область видимости, как функция, а метод это функция, вложенная в эту область видимости, то очевидно, что если какое-то имя не находится локально, его надо искать в следующей внешней области видимости, и это должен быть уровень класса, а не места, где этот класс определен.

`Copy Source | Copy HTML
#example #1

a =

"global"def spam():

a =

"in spam"def eggs():
b = a # capture "in spam"# example #2

a =

"global" class Spam:

a =

"in spam"def eggs(self):
b = a # capture "global"
`

Я уже молчу про избыточность self и его ни фига не лаконичную природу -- "много лишних букв".
Хотелось бы еще прибегнуть к аргументу, что обращение к чему-то вне класса, это экзотика, но лично у меня на практике часто встречалась ситуация, когда класс описывается внутри функции и агрессивно пользуется захватам ее переменных и замыканиями.

В любом случае, это все бессмысленные ворчания, ни мы, ни наши дети вряд ли доживут до прекрасного времени, когда можно будет написать from __future__ import implicit self

рецепты салатов

LJ Video