调用元类基础时出错:函数()的第一个参数必须是代码,而不是字符串
我今天试着去扩展(子类化)一个叫做 threading.Condition 的东西,但没成功。当我尝试去扩展这个 threading.Condition 类时,Python 解释器给我输出了以下内容:
>>> import threading
>>> class ThisWontWork(threading.Condition):
... pass
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Error when calling the metaclass bases
function() argument 1 must be code, not str
有人能解释一下这个错误吗?谢谢!
4 个回答
29
关于模块的子类化,这其实是一个很容易犯的错误。比如说,你在一个文件 Foo.py 中定义了一个类 Foo。
当你在另一个文件中创建 Foo 的子类时,你可能会不小心写成下面这样(这实际上是在尝试对子类化一个模块,会导致错误):
import Foo
class SubclassOfFoo(Foo):
而你实际上需要做的是其中之一:
from Foo import Foo
class SubclassOfFoo(Foo):
或者:
import Foo
class SubclassofFoo(Foo.Foo):
31
这个问题和提问者的情况不同,但如果你试图从一个模块继承而不是从一个类继承,也可能会遇到这个错误(比如,你试图继承 My.Module 而不是 My.Module.Class)。感谢这篇文章帮我搞明白了这个问题。
类型错误:调用元类基础时出错
对于这个错误,原因可能是你把一个 Python 类的名字和它所在的模块(也就是文件)的名字起成了一样。然后你导入了这个模块,并试图像使用类一样使用它。你之所以这样做,可能是因为你之前是个 Java 程序员,没多久前还在用 Java :-)。解决这个问题的方法是导入模块中的类,而不是仅仅导入模块。或者,为了避免混淆,可以把类或模块的名字改得更明显一些,这样就能更清楚地知道你在导入什么。
95
你遇到这个错误是因为,尽管它的名字听起来像个类,实际上 threading.Condition
是一个函数,而函数是不能被继承的。
>>> type(threading.Condition)
<type 'function'>
这个不太有用的错误信息已经在 Python的错误追踪系统 上被提出来了,但他们已经标记为“不会修复”。