使用int作为基类时解释此错误

时间:2015-09-14 17:53:33

标签: python class inheritance

我知道这样做是错误的,但是我试着了解幕后发生的事情(如果你可能会用类型来扩展它)。代码如下:

>>> a = 2
>>> class C(a):
...     pass
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: int() takes at most 2 arguments (3 given)

我试图理解为什么在这个例子中会调用int()。这是a的类型,但我不明白为什么这在这里很重要。

2 个答案:

答案 0 :(得分:5)

您正在尝试从实例对象继承,这是一个整数对象。 Python将type(a)视为元类型。元类型传递类名,基类的元组和类的主体作为字典;它应该产生新的类对象。

在这种情况下,这意味着type(2)('C', (2,), {})被称为:

>>> type(2)('C', (2,), {})
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: int() takes at most 2 arguments (3 given)

通常情况下,那就是type() object本身:

>>> type('C', (object,), {})
<class '__main__.C'>

我改为使用object作为基类。

请参阅What is a metaclass in Python?,了解您不希望了解的有关元类如何在Python中工作的所有内容。

答案 1 :(得分:1)

你基本上是这样做的:

class C(2):
    pass

据我所知,你不能以这种方式从对象的实例继承。

你想这样做:

class C(int):
    pass

OR

class C(type(a)):
    pass