我想在python中将数字类型(例如int)子类化,并为其赋予光泽的复杂构造函数。像这样的东西:
class NamedInteger(int):
def __init__(self, value):
super(NamedInteger, self).__init__(value)
self.name = 'pony'
def __str__(self):
return self.name
x = NamedInteger(5)
print x + 3
print str(x)
在Python 2.4下可以正常工作,但是Python 2.6会提供弃用警告。在新的Python版本中子类型化数字类型并重新定义内置类型的构造函数的最佳方法是什么?
编辑:
在注释中发现,这种方法不需要super()行,因此可能是这样的:
class NamedInteger(int):
def __init__(self, value):
self.name = 'pony'
def __str__(self):
return self.name
x = NamedInteger(5)
print x + 3
print str(x)
我相信这是可行的,因为int是不可变的类型,并且只有
__new__
方法。但是,我很高兴知道正确的子类化方法,因此我可以使用以下行为构建一个类:x = NamedInteger(5, 'kitty')
第二编辑:
现在的最终版本如下所示:
class NamedInteger(int):
def __new__(cls, value, name='pony'):
self = super(NamedInteger, cls).__new__(cls, value)
self.name = name
return self
def __str__(self):
return self.name
x = NamedInteger(5)
y = NamedInteger(3, 'kitty')
print "%d %d" % (x, y)
print "%s %s" % (x, y)
下面的答案还提供了指向Abstract Base Classes和numbers模块的非常有趣的链接。
最佳答案
当您对不可变的内置类型进行子类化时,例如,必须使用__new__
而不是__init__
。 :
class NamedInteger(int):
def __new__(cls, value, name='pony'):
inst = super(NamedInteger, cls).__new__(cls, value)
inst.name = name
return inst
def __str__(self):
return self.name
x = NamedInteger(5)
print x + 3 # => 8
print str(x) # => pony
x = NamedInteger(3, "foo")
print x + 3 # => 6
print str(x) # => foo
关于python - 如何将构造函数添加到子类数字类型?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2732256/