Итак, я пытаюсь найти лучший (самый элегантный, с наименьшим количеством кода) способ, позволяющий переопределять определенные функции свойства (например, только получатель, только установщик и т. Д.) В Python. Я поклонник следующего способа создания свойств, поскольку все их методы инкапсулированы в одном и том же блоке кода с отступом (легче увидеть, где останавливаются функции, имеющие дело с одним свойством, и функции, связанные с следующее начало):
@apply
def foo():
"""A foobar"""
def fget(self):
return self._foo
def fset(self, val):
self._foo = val
return property(**locals())
Однако, если я хочу наследовать от класса, который определяет свойства таким образом, а затем, скажем, переопределить функцию установки foo
, это будет сложно. Я провел некоторый поиск, и большинство ответов, которые я нашел, состояло в том, чтобы определить отдельные функции в базовом классе (например, getFoo
и setFoo
), явно создать определение свойства из них (например, foo = property(lambda x: x.getFoo(), lambda x, y: x.setFoo(y), lambda x: x.delFoo())
), а затем при необходимости переопределите getFoo
, setFoo
и delFoo
.
Мне не нравится это решение, потому что оно означает, что я должен определить lambas для каждого отдельного свойства, а затем записать каждый вызов функции (когда раньше я мог только сделать property(**locals())
). Я также не получаю инкапсуляцию, которая была у меня изначально.
В идеале, то, что я хотел бы сделать, было бы примерно так:
class A(object):
def __init__(self):
self.foo = 8
@apply
def foo():
"""A foobar"""
def fget(self):
return self._foo
def fset(self, val):
self._foo = val
return property(**locals())
class ATimesTwo(A):
@some_decorator
def foo():
def fset(self, val):
self._foo = val * 2
return something
И тогда результат будет выглядеть примерно так:
>>> a = A()
>>> a.foo
8
>>> b = ATimesTwo()
>>> b.foo
16
По сути, ATimesTwo
наследует функцию получения от A
, но переопределяет функцию установки. Кто-нибудь знает способ сделать это (таким образом, который похож на пример выше)? Какую функцию будет выглядеть some_decorator
и что должна возвращать функция foo
?