[Python] - ООП в Python
От: DemAS http://demas.me
Дата: 01.02.07 07:39
Оценка:
И все-таки мне кажется, что ООП в Python 'притянут сверху', уже после написания основного ядра

Данную тему можно считать продолжением вот этого сообщения: Re[3]: [Python] — Сериализация / десериализация коллекции
Автор: Tonal-
Дата: 29.01.07


В частности:

DAS>Только что-то у меня начинает складываться впечатление, что ООП в Python не естественная фича языка, а некий механизм, написанный сверху и притянутый сверху. Как в Perl.


> Обманчивое впечатление.

> Может ты плохо знаешь что такое ООП?

Сразу признаюсь, что на практике с Python практически не работал, но чтение теории по реализации ООП в Python повергло меня в некоторое замешательство и уныние. Может быть это пока от моего недопонимания. Может быть это пройдет. Будем надеяться.
Не вдаваясь в глубь семантики языка вот некоторые вещи, которые заставляют меня настрожено относиться в ООП в Python

1) Нафига при описании каждого метода класса я должен писать туда self? Я еще могу понять, что интерпретатору Python (кстати, я правильно называю ядро языка интерпретатором?) нужна эта переменная, но не ужели при реализации языка нельзя было сделать, чтобы эта переменная каждый раз передавалась неявно? Думаю, что это не так уж и трудно было сделать, но это не сделали. Почему?

2) Работа в методах класса с переменными этого же класса:

However, in statements that are in methods defined in a class body, references to attributes of the class must use a fully qualified name, not a simple name. For example:

class C4:
x = 23
def amethod(self):
print C4.x # must use C4.x, not just x


Почему? Почему перед именем переменной я должен указывать имя класса которому принадлежит переменная. А что, интерпретатор сам этого вычислить не может?
Метод класса, данная переменная не объявлена как локальная. Значит это переменная класса — что же это еще может быть? Тем более, что она и объявлена в теле класса.

3) Кстати, про переменные класса:

        class C1:
            x = 23
        
        print C1.x
        C2.x = 23
      print C2.x


То есть, я могу добавлять свои переменные класса не в объявлении класса, а где угодно в коде. А зачем? Ведь это источник глупых ошибок, когда я опечатался и неправильно набил имя переменной класса.
Да и читабельность кода это никак не повышает.

4) Почему при вызове метода предка я должен указывать явно имя класса-предка:

        class Base:
    def greet(self, name): print "Welcome ", name
class Sub(Base):
    def greet(self, name):
        print "Well Met and",
        Base.greet(self, name)


        Base.greet(self, name)


Вместо super(name); в java.

В общем то, все это не смертельно, но не создает впечатление целостности.

p.s. Пишу все это не для того, чтобы обругать язык, а чтобы понять — почему сделали именно так, как есть.
... << RSDN@Home 1.2.0 alpha rev. 669>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.