我想知道 int
、list
、string
和其他不可变类型的继承是如何工作的。
基本上我会像这样继承一个类:
class MyInt(int):
def __init__(self, value):
?!?!?
我似乎无法弄清楚,如何设置像为 int
设置的值?如果我执行 self.value = value
那么我的类将像这样使用:
mi = MyInt(5)
print(mi.value) # prints 5
而我想这样使用它:
mi = MyInt(5)
print(mi) # prints 5
我该怎么做?
您可以子类化 int
,但因为它是不可变的,所以您需要提供 .__new__()
constructor hook :
class MyInt(int):
def __new__(cls, value):
new_myint = super(MyInt, cls).__new__(cls, value)
return new_myint
您确实需要调用基础 __new__
构造函数来正确创建您的子类。
在 Python 3 中,您可以完全省略 super()
的参数:
class MyInt(int):
def __new__(cls, value):
new_myint = super().__new__(cls, value)
return new_myint
当然,这假设你想在传递给 super().__new__()
之前操纵 value
或者再操纵 new_myint
返回前;否则,您也可以删除整个 __new__
方法,并将其实现为 class MyInt(int): pass
。