Использование ParentClass.method (self, * args, ** kwargs) или super (MyClass, self) .method (* args, ** kwargs) - PullRequest
4 голосов
/ 23 апреля 2011

Если у вас есть класс, который наследуется от одного класса, каков предпочтительный и наиболее питонический способ вызова родительских методов? Есть два способа вызова родительского метода.

Вариант 1:

ParentClass.method(self, *args, **kwargs)

Вариант 2:

super(MyClass, self).method(*args, **kwargs)

Вариант 1 определенно имеет большой смысл при работе с множественным наследованием; мы хотим специально вызвать метод определенного класса. Но при работе с единичным наследованием любой способ работает, хотя вариант 1, вероятно, более безопасен в будущем. Но есть ли что-нибудь (например, PEP), которое говорит, когда использовать какой стиль?

1 Ответ

6 голосов
/ 23 апреля 2011

Прежде всего, если у вас есть классы старого стиля, вам нужно использовать Вариант 1 .

Если нет, это зависит от кода:

  • Если суперкласс (или подклассы) использует super (или ничего), вы можете безопасно использовать супер. Это также означает, что ваши subclsses должны использовать super вместо Parent.method(self, ...).
  • Если суперкласс (или подклассы) использует старый Parent.method(self, ...), также используйте его.

Есть хорошее и гораздо более подробное объяснение на http://fuhm.net/super-harmful/. Краткое резюме (даже короче моего объяснения выше):

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