我需要一个可以保留Python所有int
类功能的类,但要确保其结果在32位整数内,就像在C编程语言中一样。该类型必须是“有毒的”-在int上执行操作,并且该类型应导致返回此类型。正如我对其他问题的答案之一所建议的那样,我曾经numpy.uint32
为此目的而使用,但是为单个相对简单的类型添加如此大的依赖关系实在太愚蠢了。我该如何实现?到目前为止,这是我的尝试:
MODULO = 7 # will be 2**32 later on
class u32:
def __init__(self, num = 0, base = None):
print(num)
if base is None:
self.int = int(num) % MODULO
else:
self.int = int(num, base) % MODULO
def __coerce__(self, x):
return None
def __str__(self):
return "<u32 instance at 0x%x, int=%d>" % (id(self), self.int)
def __getattr__(self, x):
r = getattr(self.int, x)
if callable(r):
def f(*args, **kwargs):
ret = r(*args, **kwargs) % MODULO
print("x=%s, args=%s, kwargs=%s, ret=%s" % (x, args, kwargs, ret))
if x not in ['__str__', '__repr__']:
return u32(ret)
return r(*args, **kwargs)
return f
return r
u = u32(4)
print("u/2")
a = u * 2
assert(isinstance(a, u32))
print("\n2/u")
a = 2 * u
assert(isinstance(a, u32))
print("\nu+u")
"""
Traceback (most recent call last):
File "u32.py", line 44, in <module>
a = u + u
File "u32.py", line 18, in f
ret = r(*args, **kwargs) % MODULO
TypeError: unsupported operand type(s) for %: 'NotImplementedType' and 'int'
"""
a = u + u
assert(isinstance(a, u32))
显然正确的方法是编写所有特殊方法(这可能很痛苦)。
否则,请为您尝试 __getattr__
def __getattr__(self, x):
r = getattr(self.int, x)
if callable(r):
def f(*args, **kwargs):
if args and isinstance(args[0], u32):
args = (args[0].int, ) + args[1:]
ret = r(*args, **kwargs)
if ret is NotImplemented:
return ret
if x in ['__str__', '__repr__', '__cmp__', '__index__']:
return ret
ret %= MODULO
return u32(ret)
return f
return r
正如Martijn所指出的,这仅适用于老式类。请参阅他的答案以获取适用于新型类的方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句