«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как Super() в Python 3.x работает без аргументов и каковы потенциальные ловушки?

Как Super() в Python 3.x работает без аргументов и каковы потенциальные ловушки?

Опубликовано 7 ноября 2024 г.
Просматривать:816

 How Does Python 3.x\'s Super() Work Without Arguments, and What Are the Potential Pitfalls?

Супермагия Python 3.x: разгадка тайн

В Python 3.x появился неожиданный поворот в методе super(), позволяющий звонки без аргументов. Это, казалось бы, безобидное изменение несет в себе серьезные последствия и скрытую магию.

Раскрытие магии

Чтобы сохранить принцип DRY, новое поведение super() обходит явный класс именование. У него есть специальная ячейка class, которая извлекает исходный объект класса, избегая ошибок повторного связывания, которые мешали предыдущему суперподходу.

Последствия магии

К сожалению, у этой магии есть недостаток. Повторная привязка имени super() к другой переменной, например super_, может нарушить его функциональность. Это происходит потому, что ячейка создается только тогда, когда в методе ссылаются на суперкласс или класс.

Практические ошибки

Такое поведение может представлять опасность для ничего не подозревающие программисты:

  • Перепривязка super() может привести к неожиданным исключениям.
  • Опора на super(type(self), self) или super(self.__class__, self) может привести к в бесконечной рекурсии при вызове из производного класса.
  • Декораторы класса, возвращающие новые объекты класса, могут сделать недействительной привязку имени класса к super().

Beyond Super()

Примечательно, что super() — не единственная сущность Pythonic, затронутая проблемами перепривязки. Другие примеры включают в себя:

  • this в RPython PyPy (аналогично __class__ в super())
  • Методы экземпляра, доступные через несвязанные объекты метода (потенциально нарушающие @ свойство и @classmethod)
  • Встроенные функции, такие как print, object и list, при вызове без точечной записи

Последствия для разработчиков

Хотя магия super() может быть полезной, она требует осторожности. Понимание его тонкостей помогает предотвратить ошибки во время выполнения. При использовании перепривязок программистам следует рассмотреть возможность явной ссылки на класс или использования альтернативных методов вызова super().

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3