我在这里参考了 python 文档来了解如何在 python 中创建一个具有受控 getter 和 setter 方法的类属性。 https://docs.python.org/3/howto/descriptor.html#id6我用这段代码创建了一个描述符属性类:class PropNumberString(object): def __init__(self, initval=None, name='var_int'): self.val = initval self.name = name def __get__(self, obj, objtype): print("in getter") return self.val def __set__(self, obj, val): print("in setter") self.val = int(val) def __add__(self, val): print("adding") print("val to add: ", val) self.val = int(self.val) + int(val) return self def __radd__(self, val): return self.__add__(val)class ConnectionTemplate(object): tid = PropNumberString(0, "ID")我也尝试定义一个 add 方法,即使提供了一个字符串,它也总是添加一个整数。这不起作用,似乎调用了“__get__”,然后调用了返回整数的add方法而不是我的add方法。这是一个测试来证明:my_template = ConnectionTemplate()print("Getting value")print(my_template.tid)print("Updating value")my_template.tid = 100print("Doing add")my_template.tid = my_template.tid + "1"print(my_template.tid)print("type: ", type(my_template.tid))输出:Getting valuein getter0Updating valuein setterDoing addin getterTraceback (most recent call last): File "connection_template.py", line 53, in <module> my_template.tid = my_template.tid + "1"TypeError: unsupported operand type(s) for +: 'int' and 'str'有没有好的解决方案?
1 回答
函数式编程
TA贡献1807条经验 获得超9个赞
您不需要为此定义自定义描述符。您只需要tid返回一个添加您想要的方式的类。最好在设置而不是获取上进行转换。这是一个实现:
class MyInt(int):
def __add__(self, val):
return MyInt(super().__add__(int(val)))
__radd__ = __add__
class ConnectionTemplate(object):
def __init__(self):
self._tid = 0
@property
def tid(self):
return self._tid
@tid.setter
def tid(self, val):
self._tid = MyInt(val)
添加回答
举报
0/150
提交
取消