55

我今天早些时候尝试对 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

4 回答 4

91

你得到那个异常是因为,尽管它的名字类似于类,它threading.Condition是一个函数,你不能继承函数。

>>> type(threading.Condition)
<type 'function'>

在 Python bugtracker 上提出了这个不太有用的错误消息,但它已被标记为“不会修复”。

于 2010-02-09T18:31:36.627 回答
30

与 OP 不同的问题,但如果您尝试从模块而不是类进行子类化(例如,您尝试继承 My.Module 而不是 My.Module.Class),您也会收到此错误。感谢这篇文章帮助我解决了这个问题。

TypeError:调用元类库时出错

对于这个,答案是您可能将python 类命名为与它所在的模块(即文件)相同的东西。然后您导入了该模块并尝试像使用类一样使用它。你这样做是因为你和我一样,不久前可能是一名 Java 程序员 :-)。修复它的方法是导入 module.class 而不仅仅是模块。或者,为了理智起见,更改类或模块的名称,以便更清楚地看到正在导入的内容。

于 2010-08-17T22:32:50.503 回答
27

关于子类化一个模块,如果你有一个非常容易犯的错误,例如,在文件 Foo.py 中定义了类 Foo。

当您在不同的文件中创建 Foo 的子类时,您可能会意外地执行以下操作(这是尝试子类化模块并将导致错误):

import Foo
class SubclassOfFoo(Foo):

当您确实需要执行以下任一操作时:

from Foo import Foo
class SubclassOfFoo(Foo):

或者:

import Foo
class SubclassofFoo(Foo.Foo):
于 2013-06-12T14:02:15.410 回答
2

陷入了同样的问题。最后通过仔细查看代码解决了问题,这就是TypeError关于字符串而不是代码的警报出现的地方..

Class Class_name(models.model): //(gives a TypeError of 'str' type) 

“和”

Class Class_name(models.Model): // is the correct one. 

请注意,由于代码“模型”的单个小写字母而导致特定错误,这反过来又使其成为字符串

于 2016-10-21T08:06:46.290 回答