首页 > 解决方案 > 使用属性装饰器给两个字典起别名——属性可以下标吗?

问题描述

我希望c是a + b。

class A:
    def __init__(self, a, b):
        self.a = a
        self.b = b

    @property
    def c(self):
        return self.b + self.a
    @c.setter
    def c(self, value):
        self.b = value - self.a
        return self.b

这工作正常。

ex = A(1,2)
(ex.b, ex.c) # returns (2,3)
ex.c = 10
(ex.b, ex.c) # returns (9,10)

但是如果我想让 b 成为一个字典呢?

class A:
    def __init__(self, a, b):
        self.a = a
        self.b = b

    @property
    def c(self, key):
        return self.b[key] + self.a
    @c.setter
    def c(self, key, value):
        self.b[key] = value - self.a
        return self.b[key]

它不喜欢那样。

ex = A(1,{'test' : 2})
(ex.b['test'],ex.c['test']) # TypeError: c() missing 1 required positional argument: 'key'

我想原因是 ex.c 在看到 ['test'] 部分之前就被解析了。

如何避免这个问题?

标签: pythondictionarypropertiesdecoratorgetter-setter

解决方案


试试这个:

@property
def c(self, key, value=None):
   if value:
       self.b[key] = value - self.a
       return self.b[key]
   else:
       return self.b[key] + self.a

python不允许重载


推荐阅读