Итак, я пытаюсь найти лучший (самый элегантный с наименьшим количеством кода) способ разрешить переопределение определенных функций свойства (например, только getter, только setter и т.д.) в python. Я являюсь поклонником следующего способа выполнения свойств из-за того, что все их методы инкапсулированы в один и тот же отступы блок кода (проще видеть, где функции, связанные с одним свойством, останавливаются и функции, связанные с следующее начало):
@apply
def foo():
"""A foobar"""
def fget(self):
return self._foo
def fset(self, val):
self._foo = val
return property(**locals())
Однако, если я хочу наследовать от класса, который определяет свойства таким образом, а затем, скажем, переопределить функцию set t1 > , это кажется сложным. Я сделал несколько поисков, и большинство ответов, которые я нашел, заключались в том, чтобы определить отдельные функции в базовом классе (например, 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
наследует функцию getter от A
, но переопределяет функцию setter. Кто-нибудь знает способ сделать это (таким образом, который похож на приведенный выше пример)? Какая функция будет выглядеть как some_decorator
и что должна вернуть функция foo
?