Если на протяжении достаточного продолжительного времени вы использовали какой-либо язык программирования для «материализации» своих мыслей, то обязательно найдётся то, что хотелось бы изменить. Такая штука произошла у меня с Python. Есть несколько мыслей по поводу Python, которые требуют (имхо) его изменений, но, к сожалению, это не в моих силах. Тем не менее, одной из них я вас загружу: синтаксис описания классов.
Начнем сию мыслю с синтаксиса определения функций. У него действительно хорошее свойство: описание функций соответствует их вызову. Описание выглядит следующим образом:
def func_name ( arg1, arg2 ):
При вызове используется похожий синтаксис: имя функции и список фактических аргументов в скобках через запятую:
x = func_name ( 12, 34 )
Если сравнить запись вызова с описанием функции, то всем ясно и понятно, что формальному аргументу arg1 соответствует фактическое значение 12, а arg2, естественным образом, соответствует 34. Замечательно.
А теперь обратимся к описанию класса-наследника базовых классов:
class MyClass ( BaseClass, AnotherBase ):
При создании экземпляра этого класса, вы используете имя класса и аргументы конструктора, но теперь аналогия пропадает. Вы не передаете родительский BaseClass
для создания MyClass
:
my_obj = MyClass ( ... )
Глядя на строку описания класса, вы не можете сказать, что должно быть в скобках при создании объект (экземпляра класса) MyClass
. Таким образом, def
и class
имеют очень сходный синтаксис, вызов функций и создание экземпляров класса так-же имеют очень сходный синтаксис, но аналогия в вызове функции приводит вас к правильной ассоциации и полностью сбивает с толку при создании объектов.
Это то, когда можно сказать «мимо кассы». Загадочно используется схожий синтаксис для качественно различных вещей, а лёгкие различия определяются в контексте. В языках для программирования многое из этого неизбежно: символов очень много, а концепций ещё больше. Так что совпадения должны быть.
Но в наших силах сделать всё лучше. Зачем использовать круглые скобки, которые используются для описания функции при обозначения базовых классов? Мне кажется, что такой синтаксис будет лучше и понятней:
class MyClass from BaseClass, AnotherBase :
Это не только позволяет избежать вводящей в заблуждение аналогии, но даже совершенно естественно для английского, когда мы говорим о классах: MyClass
наследуется от BaseClass
и AnotherBase
. И from
уже является ключевым словом Python.
Кстати, даже опытные программеры иногда допускают ошибки, набирая def
там, где надо написать class
. До исполнения кода и трассировки подобную ошибку трудно обнаружить и это может сбить с толку.
Я не настаиваю немедленно изменить Python. Не потому, что так было бы лучше, а потому, что подобное изменение нецелесообразно для крайнего релиза, уже опоздало. Я предполагаю добавить этот синтаксис в качестве альтернативного. Однако, дерзко утверждать, что существование двух способов описания классов было бы лучше для начинающих.
Но я думаю, что полезно попытаться увидеть наш знакомый пейзаж там, где новички запутаются. Им это можно просто объяснить, а нам, возможно, это поможет сделать правильный выбор в будущем.
Источник вдохновения:
Поменять бы синтаксис описания класса в Python, опубликовано К ВВ, лицензия — Creative Commons Attribution-NonCommercial 4.0 International.
Респект и уважуха