我想在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版本中为子类化数值类型并重新定义内置类型的构造函数的最佳方式是什么?
编辑: 看准评论认为,这部作品没有超()行,所以它可能是这样的:
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模块非常有趣的链接。
+1好问题 - 请参阅[关于Python bug跟踪器的此线程](http://bugs.python.org/issue1683368)了解此更改的历史记录。 – balpha 2010-04-28 18:54:30