cd_riper (cd_riper) wrote,

Python + self = ?

Начну издалека. После того, как я изучил венец эволюции языков программирования по теории тов. Вирта -- язык 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

рецепты салатов
Tags: programming, python
  • Post a new comment

    Error

    Comments allowed for friends only

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 3 comments