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

我在这里参考了 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 = 100


print("Doing add")

my_template.tid = my_template.tid + "1"


print(my_template.tid)

print("type: ", type(my_template.tid))

输出:


Getting value

in getter

0

Updating value

in setter

Doing add

in getter

Traceback (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'

有没有好的解决方案?


幕布斯6054654
浏览 147回答 1
1回答

函数式编程

您不需要为此定义自定义描述符。您只需要tid返回一个添加您想要的方式的类。最好在设置而不是获取上进行转换。这是一个实现:class MyInt(int):&nbsp; &nbsp; def __add__(self, val):&nbsp; &nbsp; &nbsp; &nbsp; return MyInt(super().__add__(int(val)))&nbsp; &nbsp; __radd__ = __add__class ConnectionTemplate(object):&nbsp; &nbsp; def __init__(self):&nbsp; &nbsp; &nbsp; &nbsp; self._tid = 0&nbsp; &nbsp; @property&nbsp; &nbsp; def tid(self):&nbsp; &nbsp; &nbsp; &nbsp; return self._tid&nbsp; &nbsp; @tid.setter&nbsp; &nbsp; def tid(self, val):&nbsp; &nbsp; &nbsp; &nbsp; self._tid = MyInt(val)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python