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

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

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

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

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

"Для классов нового стиля порядок разрешения методов изменяется динамически для поддержки совместных вызовов super ()".

1 Ответ

6 голосов
/ 07 декабря 2011

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

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 ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...