使用以下代码,我收到以下错误:
class C4(int):
def __init__(self,name1,name2):
self.name1=name1
self.name2=name2
当执行上面的代码时,我收到错误:
C4_inst=C4(3,6)
TypeError: int() can't convert non-string with explicit base
当我只为__init__
使用一个参数时,我没有看到错误。你能否详细说明为什么当这里的目标是用3,6实例化C4时,python会尝试将参数转换为int
。
我试图将C4作为" int"的子类,以便我可以使用为" int"定义的运算符。键入C4类。
答案 0 :(得分:2)
基类int
类型是不可变的,因此其参数在其__new__
方法中解释,而不是__init__
。由于您尚未定义自己的__new__
方法,因此正在调用基类的版本,并且它不了解您的参数。可以使用两个参数初始化int
,但第一个必须是字符串,第二个必须是整数(基数)。
尝试添加正确初始化整数值的__new__
方法:
class C4(int):
def __new__(cls, name1, name2):
return super(cls, C4).__new__(cls) # let int.__new__ create a new value.
def __init__(self, name1, name2):
self.name1=name1
self.name2=name2
请注意,由于我们未向int.__new__
传递任何参数,因此我们的新实例将等于0
(因为我们没有__repr__
或__str__
方法,它也会打印为0
)。如果您希望对象的行为类似于其int
个参数之一(或其他一些非零值),那么您希望在调用int.__new__
时传递该对象。