我一直在尝试模拟一个任意长度的二进制寄存器,它可以像 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/