Я хочу знать, почему python не создает __bases__
как локальную переменную в теле класса
Как вы знаете, class
- это в основном ярлык для type.__new__()
- когда среда выполнения достигает операторов class
, он выполняет все операторы на верхнем уровне тела class
, собирает все полученные привязки в выделенный dict пространства имен вызывает type()
с конкретным метаклассом, именем класса, базовыми классами и dict пространства имен и связывает результирующий объект класса с именем класса во вложенной области видимости (обычно, но не обязательно, на верхнем уровне модуля). Пространство имен).
Важным моментом здесь является то, что метакласс отвечает за создание объекта класса, и для обеспечения возможности создания объекта класса метакласс должен быть свободным делать с аргументами все, что он хочет. Чаще всего пользовательский метакласс будет работать в основном с диктовкой attrs
, но он также должен иметь возможность связываться с аргументом bases
. Теперь, когда метакласс вызывается только ПОСЛЕ того, как были выполнены операторы тела класса, среда выполнения не может надежно представить bases
в области видимости тела класса, так как эти базы могут быть впоследствии изменены метаклассом.
Здесь также есть несколько более философских соображений, в частности, в отношении явного / явного по сравнению с неявным, и, как упоминает shx2, разработчики Python стараются избегать магических переменных, появляющихся на ровном месте. Действительно, есть пара переменных реализации (__module__
и, в py3, __qualname__
), которые "автоматически" определены в пространстве имен тела класса, но это просто имена, в основном предназначенные в качестве дополнительной информации отладки / проверки для разработчиков) и не имеют абсолютно никакого влияния ни на создание объекта класса, ни на его свойства, поведение и тому подобное.
Как всегда в Python, вы должны учитывать весь контекст (модель исполнения, объектную модель, как разные части работают вместе и т. Д.), Чтобы действительно понять выбор дизайна. Согласны ли вы со всем дизайном и философией, это еще один спор (и тот, который здесь не относится), но вы можете быть уверены, что да, эти варианты являются «осознанными проектными решениями».