Python + self = ? (original) (raw)
March 19 2010, 10:13
Categories:
- IT
- Путешествия
- Cancel
Начну издалека. После того, как я изучил венец эволюции языков программирования по теории тов. Вирта -- язык Oberon, я смог однозначно ответить для себя на вопрос: сколько фич надо добавить в старый добрый си, чтобы на нем можно было более-менее сносно программировать в объектно-ориентированном стиле.
Знающие Oberon наверняка догадались -- ровно одну. Наследование структур.
Понятно, что когда "Великий Диктатор" Гвидо вводил объектную модель в питон, было грех не воспользоваться уже готовой реализацией модулей, как неким пространством-словарем. Единственная загвоздка -- методы, которые должны содержать явный или неявный указатель на экземпляр класса, плюс особый режим разрешения видимости переменных внутри них.
Если быть предельно ленивым, и пытаться решить вопрос малой кровью -- self очевидное решение. Оно действительно упрощает и реализацию, и описание языка в том плане, что не надо различать указатель на функцию и указатель на метод (к которому опционально может быть подвязан указатель на экземпляр).
Главным моментом в критике self, как явления, считается тот факт, что пользователей языка сбивает количественное несоответствие параметров: при вызове метода параметров всегда выходит на один меньше.
Как по мне, главная проблема все-таки не в этом. Главное -- нарушение логики поиска имен. Если представить себе, что класс, это такая же область видимости, как функция, а метод это функция, вложенная в эту область видимости, то очевидно, что если какое-то имя не находится локально, его надо искать в следующей внешней области видимости, и это должен быть уровень класса, а не места, где этот класс определен.
`Copy Source | Copy HTML
#example #1a =
"global"def spam():
a =
"in spam"def eggs():
b = a # capture "in spam"# example #2a =
"global" class Spam:
a =
"in spam"def eggs(self):
b = a # capture "global"
`
Я уже молчу про избыточность self и его ни фига не лаконичную природу -- "много лишних букв".
Хотелось бы еще прибегнуть к аргументу, что обращение к чему-то вне класса, это экзотика, но лично у меня на практике часто встречалась ситуация, когда класс описывается внутри функции и агрессивно пользуется захватам ее переменных и замыканиями.
В любом случае, это все бессмысленные ворчания, ни мы, ни наши дети вряд ли доживут до прекрасного времени, когда можно будет написать from __future__ import implicit self