python - 向不可变类型子类添加属性

标签 python python-3.x attributes immutability

我一直在尝试模拟一个任意长度的二进制寄存器,它可以像 Python int 一样被操作,但是会被初始化为固定长度并且会有特殊的上溢/下溢行为。 (即你可以将它添加到其他 int 中,并得到一个相同长度的 Register 作为返回)

阅读了一下,似乎建议将 int 子类化,我一直在阅读 this关于不可变类型子类化;但我不知道如何向它添加属性。

在我看来这应该是可能的,因为我只是想添加静态行为。但是形式的代码:

def __new__(S, size, *args, **kwargs)
    r = super(Register, S).__new__(S, 0)
    r.maxVal = 2**size
    return r

看起来很荒谬,因为 r 是不可变的。我什至不知道该将 maxVal 放在哪里。它执行时没有错误(调用 r = Register.__new__(Register, 16) ; print(r) 打印 0,尽管我重载了 __repr__),但我仍然不知道我在这里做什么。

因此我寻求帮助。这种行为是可能的,可取的吗?这种方法正确吗?提前致谢。

最佳答案

相同的参数用于连接 __new__()__init__()。这样一来,就可以...

  • __new__() 中创建一个新实例,使用 super() 不带附加参数,并且
  • 根据附加参数在 __init__() 中添加一个属性。
    class Register(int):

      def __new__(cls, size, *args, **kwargs):
        return super().__new__(cls, *args, **kwargs)

      def __init__(self, size, *args, **kwargs):
        self.maxVal = 2**size

关于python - 向不可变类型子类添加属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51895592/

相关文章:

Python 对列表的插入操作

python-3.x - 如何使用python调试器和Visual Studio Code调试Behave BDD场景

python - 如何在 python nmap 中提供 inputfilefile(-iL) 选项?

html - 如何对 HTML 中的图像进行分类并显示通过超链接单击给定类别的所有图像

python - 如何在python中调用外部程序并检索输出和返回代码?

python - 创建知道每个列表长度的子列表

java - Struts 2中如何获取action标签的请求属性

asp.net-mvc - MVC模型验证程序化注册支持

python - 将 pandas.Series 从 dtype 对象转换为 float ,将错误转换为 nans

python - 值错误 : Dependency on app with no migrations: customuser