Функция класса Python возвращает super()Python

Программы на Python
Anonymous
Функция класса Python возвращает super()

Сообщение Anonymous »

Итак, я возился с шаблоном класса, изменяемым только для чтения, который довольно распространен в Java. Он включает в себя создание базового класса, содержащего свойства, доступные только для чтения, и расширение этого класса для модифицируемой версии. Обычно существует функция readonly() или что-то подобное, позволяющее вернуть изменяемую версию обратно в версию, доступную только для чтения.
К сожалению, вы не можете напрямую определить установщик для свойство, определенное в суперклассе Python, но вы можете просто переопределить его, как показано ниже. Более интересно: в Python у вас есть «магическая функция» super, возвращающая прокси-объект родительского/суперкласса, что позволяет реализовать дерзкую реализацию readonly(), которая кажется действительно хакерской, но, насколько я понимаю, могу проверить, просто работает.

Код: Выделить всё

class Readonly:
_t:int

def __init__(self, t: int):
self._t = t

@property
def t(self) -> int:
return self._t

class Modifyable(Readonly):
def __init__(self, t: int):
super().__init__(t)

@property
def t(self) -> int:
return self._t # can also be super().t

@t.setter
def t(self, t):
self._t = t

def readonly(self) -> Readonly:
return super()

В приведенном выше шаблоне я могу вызвать функцию только для чтения и получить прокси для родительского объекта без необходимости создавать экземпляр версии только для чтения. Единственная проблема заключается в том, что при установке атрибута readonly вместо выдачи AttributeError: can't set Attribute будет выдаваться AttributeError: объект 'super' не имеет атрибута ''
Итак, вот вопрос:
  • Может ли это вызвать проблемы (разоблачение супер) прокси-объект вне самого класса)?
  • Я тестировал это на Python 3.8.5, но не уверен, что это случайно и противоречит, так сказать, «семантике Python»?
  • Есть ли лучший/более желательный способ добиться этого? (Я понятия не имею, стоит ли это вообще двусмысленного сообщения об ошибке, например, в отношении производительности)
Мне хотелось бы услышать мнения и/или идеи по поводу это

Подробнее здесь: https://stackoverflow.com/questions/753 ... turn-super

Вернуться в «Python»