Я не делаю VBA, но в Python модули являются фундаментальными.Как вы говорите, они могут рассматриваться как пространства имен, но они также являются объектами сами по себе.Однако они не являются классами, поэтому вы не можете наследовать от них (по крайней мере, не напрямую).
Я считаю, что это хорошее правило, чтобы модуль занимался одной областью домена.Правило, которое я использую для определения, является ли что-то функцией уровня модуля или методом класса, - спрашивать себя, может ли это быть осмысленно использовано на любых объектах, которые удовлетворяют «интерфейсу», который принимают его аргументы.Если так, то я освобождаю его от иерархии классов и делаю его функцией уровня модуля.Если его полезность истинно ограничена определенной иерархией классов, тогда я сделаю это методом.
Если вам нужно, чтобы он работал на всех экземплярах иерархии классов, и вы делаете это на уровне модуляфункции, просто помните, что все подклассы все еще должны реализовать данный интерфейс с заданной семантикой.Это один из компромиссов отказа от методов: вы больше не можете вносить небольшие изменения и вызывать super
.С другой стороны, если подклассы могут переопределить интерфейс и его семантику, то, возможно, эта конкретная иерархия классов не очень хорошая абстракция и ее следует переосмыслить.