И все-таки мне кажется, что ООП в 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>>