Property в классе наследнике

Опубликовано 30 May 2017 в Python

Кажется очевидным, что property можно переопределить в классе наследнике и вызвать super внутри этого переопределенного свойства. Вроде бы звучит нормально? Да, так и есть. Тем не менее, когда мой коллега задал мне такой вопрос, я "завис" на некоторое время. Возможно я излишне подозрителен, но каждый раз когда в коде есть какая-то магия, я ожидаю подвоха. Поэтому, я решил немного поэкспериментировать и доказать себе, что проперти работают так как ожидается.

# -*- 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 всего лишь устанавливает объект особого типа вместо функции (которая, кстати, так же является объектом особого типа) и не трогает внутреннюю структуру класса. Так что подобное поведение ожидаемо и ясно описано в документации. Но кто читает доки?

---
Возник вопрос? Мне всегда можно написать в Twitter: avkorablev