Кажется очевидным, что property можно переопределить в классе‑наследнике и вызвать super внутри этого переопределённого свойства. Вроде бы звучит нормально? Да, так и есть. Тем не менее, когда мой коллега задал мне такой вопрос, я «завис» на некоторое время. Возможно, я излишне подозрителен, но каждый раз, когда в коде есть какая‑то магия, я ожидаю подвоха. Поэтому я решил немного поэкспериментировать и доказать себе, что свойства (property) работают так, как ожидается.
# -*- coding: utf-8 -*-
from __future__ import print_function, unicode_literals, absolute_import
class Parent(object):
@property
def prop(self):
print("Parent property")
class Child(Parent):
@property
def prop(self):
super(Child, self).prop
print("Child property")
child = Child()
child.prop
Работает, как и ожидалось:
Parent property
Child property
В действительности декоратор property всего лишь устанавливает объект особого типа вместо функции (которая, кстати, также является объектом особого типа) и не трогает внутреннюю структуру класса. Так что подобное поведение ожидаемо и ясно описано в документации. Но кто читает доки?