Python: порядок разрешения метода объектов старого стиля (или классического) и нового стиля

Я много читал об объектах в документации на Python, которые в какой-то момент различают эти два типа:

  • Старые экземпляры, независимо от их класса, реализованы с помощью одного встроенного типа, называемого экземпляром.
  • Класс нового стиля не больше и не меньше пользовательского типа.

Может ли кто-нибудь объяснить мне больше об этом «старом стиле (или классическом) и новом стиле».

Я не могу понять, что эта строка пытается сказать:

«Для классов нового стиля порядок разрешения метода изменяется динамически, чтобы поддерживать совместные вызовы super ()».

Старый стиль:

class BaseClass: def m1(self): return 1 class MyClass(BaseClass): def m1(self): return BaseClass.m1(self) 

Новый стиль класса:

 class BaseClass(object): def m1(self): return 1 class MyClass(BaseClass): def m1(self): return super(MyClass, self).m1() 

У них много возможностей с использованием новых стилей классов, таких как:

  • super(classname, ...).method() вместо parentclassname.method(...) . Теперь родительский метод определяется из MRO (раньше он был определен вами).
  • __slots__ – это новая функция, которая может помешать добавить dict () в ваш объект и выделить память только для атрибута в __slots__
  • Свойства python ( @property , property() …) работают только с новыми стилями классов.

О MRO, проверьте документ . Порядок разрешения метода Python 2.3 . До 2.2 реализация была:

сначала глубина, а затем слева направо

в то время как новый – C3, намного сложнее, но обрабатывает различные случаи, которые предыдущий не обрабатывал правильно (проверьте сообщение Samuele Pedroni в списке рассылки python ).