python - 使用属性装饰器给两个字典起别名——属性可以下标吗?
问题描述
我希望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'] 部分之前就被解析了。
如何避免这个问题?
解决方案
试试这个:
@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不允许重载
推荐阅读
- sharepoint - 如何获取外部/访客 Office 365 用户照片?
- python - 从演示文件中提取图像
- python - 斯坦福 NLP(NER 建模)- java.lang.UnsupportedOperationException:参数数组长度不同
- c# - 从 WebAPI 调用时,HttpClient 更改请求 URI
- sql - 甲骨文 SQL。选择 MAX(日期)
- r - 分解因子变量中的级联水平并创建频率表
- css - 在 Chartjs Angular 5 中更改字体大小和字体颜色
- javascript - 错误:在 nodejs 中找不到模块“环回”
- node.js - 如何在一个请求中在 Mongoose 中创建多个文档
- vue.js - vue.js 中的“Access-Control-Allow-Origin”错误