До Python 2.2 существовало два разных типа классов: классы, определенные расширениями C и кодированными встроенными командами (типами), и классы, определенные операторами (классами) python. Это привело к проблемам, когда вы хотели смешать типы Python и встроенные типы. Наиболее распространенной причиной этого является создание подклассов. Если вы хотели создать подкласс типа списка в коде python, вам не повезло, и поэтому вместо этого использовались различные обходные пути, такие как создание подклассов чистой реализации Python для списков (в модуле UserList).
Это было довольно уродливо, поэтому в 2.2 был ход для объединения типов Python и встроенных, включая возможность наследовать от них . Результат - «новые классы стиля». Однако они имеют некоторые несовместимые различия с классами старого стиля, поэтому для обратной совместимости простой синтаксис класса создает класс старого стиля, в то время как новое поведение получается путем наследования от объекта. Наиболее заметные различия в поведении:
Порядок разрешения метода (MRO). Существует различие в поведении в ромбовидных иерархиях наследования (где A наследует от B и C, которые оба наследуют от общего базового класса D. Ранее методы просматривались слева направо, сначала в глубину (то есть ABDCD). Однако если C перегружает член D, он не будет использоваться A (поскольку он сначала находит реализацию D). Это плохо для различных стилей программирования (например, с использованием классов mixin). Новые классы стилей будут рассматривать эту ситуацию как ABCD, (посмотрите на атрибут __mro__
класса, чтобы увидеть порядок, в котором он будет искать)
Добавлен конструктор __new__
, который позволяет классу действовать как фабричный метод, а не возвращать новый экземпляр класса. Полезно для возврата определенных подклассов или повторного использования неизменяемых объектов вместо создания новых без изменения интерфейса создания.
дескрипторы . Это особенность, лежащая в основе таких свойств, как свойства, методы классов, статические методы и т. Д. По сути, они предоставляют способ управления тем, что происходит, когда вы обращаетесь к определенному атрибуту в классе (новый стиль) или устанавливаете его.