【发布时间】:2017-10-25 04:16:09
【问题描述】:
所以,我试图找出最好的(用最少的代码最优雅)的方法来允许在 python 中覆盖属性的特定函数(例如,只是 getter、只是 setter 等)。我喜欢以下处理属性的方式,因为它们的所有方法都封装在同一个缩进的代码块中(更容易看出处理一个属性的函数在哪里停止以及处理下一个开始):
@apply
def foo():
"""A foobar"""
def fget(self):
return self._foo
def fset(self, val):
self._foo = val
return property(**locals())
但是,如果我想从一个以这种方式定义属性的类继承,然后,比如说,重写foo setter 函数,这似乎很棘手。我进行了一些搜索,发现的大多数答案都是在基类中定义单独的函数(例如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 的 getter 函数,但覆盖了 setter 函数。有谁知道这样做的方法(以类似于上面示例的方式)? some_decorator 看起来像什么函数,foo 函数应该返回什么?
【问题讨论】:
-
我看不到任何方法可以单独使用装饰器来做你想做的事情,因为它无法访问对象,只能访问函数。我猜你有一个装饰器,它返回一个函数,该函数在第一次调用该方法时会做进一步的工作,但是你已经覆盖了初始的 foo。另外 - 我猜你知道 - 你并没有真正按照预期的风格使用语言......但你可能会找到一种方法来使用元类来做到这一点。
-
这个类似的问题可能会有所帮助:stackoverflow.com/questions/237432/…
标签: python inheritance properties overriding