为了账号安全,请及时绑定邮箱和手机立即绑定

我可以在 python 3 中为描述符定义一个 add 方法吗?

我可以在 python 3 中为描述符定义一个 add 方法吗?

幕布斯6054654 2022-01-18 17:44:56
我在这里参考了 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)


查看完整回答
反对 回复 2022-01-18
  • 1 回答
  • 0 关注
  • 146 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信