小编Jes*_*ick的帖子

覆盖python中的属性

所以,我试图找出最好的(最优雅,代码最少)的方法来允许在python中覆盖属性的特定函数(例如,只是getter,只是setter等).我喜欢以下做属性的方法,因为它们的所有方法都被封装在相同的缩进代码块中(更容易看到处理一个属性的函数停止在哪里以及处理函数的函数下一步开始):

@apply
def foo():
    """A foobar"""
    def fget(self):
        return self._foo
    def fset(self, val):
        self._foo = val
    return property(**locals())
Run Code Online (Sandbox Code Playgroud)

但是,如果我想从以这种方式定义属性的类继承,然后,比如重写foosetter函数,那么它似乎很棘手.我做了一些搜索和大多数我已经找到了答案已经确定在基类(如独立的功能getFoosetFoo),明确从他们(例如,创建一个属性定义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): …
Run Code Online (Sandbox Code Playgroud)

python inheritance overriding properties

41
推荐指数
3
解决办法
3万
查看次数

标签 统计

inheritance ×1

overriding ×1

properties ×1

python ×1