gpt4 book ai didi

python - 如何将构造函数添加到子类数字类型?

转载 作者:太空狗 更新时间:2023-10-29 20:55:03 26 4
gpt4 key购买 nike

我想在 python 中子类化一个数字类型(比如 int),并给它一个 Shiny 的复杂构造函数。像这样:

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com