Я понимаю, что в большинстве случаев в Python предпочтительнее просто обращаться к атрибутам напрямую, поскольку нет реальной концепции инкапсуляции, как в Java и тому подобном. Однако мне интересно, нет ли каких-либо исключений, особенно с абстрактными классами, которые имеют несопоставимые реализации.
Допустим, я пишу несколько абстрактных классов (потому что я есть) и они представляют вещи, имеющие отношение к системам контроля версий, таким как репозитории и ревизии (потому что они это делают). Нечто подобное SvnRevision, HgRevision и GitRevision очень тесно семантически связаны, и я хочу, чтобы они могли делать то же самое (чтобы я мог иметь код в другом месте, который действует на любой тип объекта Repository и не зависит от подкласс), поэтому я хочу, чтобы они наследовали от абстрактного класса. Однако их реализации значительно различаются.
Пока что реализованные подклассы имеют много общих имен атрибутов, и во многих кодах вне самих классов используется прямой доступ к атрибутам. Например, каждый подкласс Revision имеет атрибут автора, атрибут даты и т. Д. Однако атрибуты нигде не описаны в абстрактном классе. Это кажется мне очень хрупким дизайном.
Если кто-то хочет написать другую реализацию класса Revision, я чувствую, что он должен сделать это, просто взглянув на абстрактный класс. Однако реализация класса, которая удовлетворяет всем абстрактным методам, почти наверняка потерпит неудачу, потому что автор не будет знать, что им нужны атрибуты с именами «author» и «date» и т. Д., Поэтому код, который пытается получить доступ к Revision. Автор выбросит исключение. Вероятно, нетрудно найти источник проблемы, но, тем не менее, раздражает, и это просто похоже на не элегантный дизайн.
Моим решением было написать методы доступа для абстрактных классов (get_id, get_author и т. Д.). Я подумал, что это на самом деле довольно чистое решение, так как оно устраняет произвольные ограничения на то, как атрибуты именуются и хранятся, и просто дает понять, к каким данным объект должен иметь доступ. Любой класс, который реализует все методы абстрактного класса, будет работать ... это правильно.
В любом случае, команда, с которой я работаю, ненавидит это решение (по-видимому, по той причине, что средства доступа не являются пифоническими, с чем я не могу поспорить). Итак ... какая альтернатива? Документация? Или проблема, которую я представляю, не является проблемой?
Примечание: я рассмотрел свойства, но не думаю, что они являются более чистым решением.