调用元类库时出错:function()参数1必须是代码,而不是str

时间:2010-02-09 18:24:16

标签: python class inheritance metaclass

我今天早些时候试图将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 个答案:

答案 0 :(得分:73)

你得到了这个例外,因为尽管它有类似于类的名称,threading.Condition是一个函数,你不能将函数子类化。

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

这个不是非常有用的错误消息是raised on the Python bugtracker,但它已被标记为“无法修复。”

答案 1 :(得分:26)

与OP不同的问题,但如果您尝试从模块而不是类中继承子类(例如,您尝试继承My.Module而不是My.Module.Class),也可能会出现此错误。感谢this post帮助我解决这个问题。

  

TypeError:调用元类库时出错

     

对于这个,答案是你可能已经命名了一个python类   与它所在的模块(即文件)相同的东西。然后你   导入模块并尝试像类一样使用它。你这样做了   因为你和我一样,可能不是那么久的Java程序员   以前:-)。修复它的方法是导入module.class而不是   只是模块。或者,为了理智,更改班级的名称   或模块,以便更明显地导入什么。

答案 2 :(得分:20)

关于子类化模块,如果有的话,这是一个非常容易犯的错误, 例如,在文件Foo.py中定义的类Foo。 当您在另一个文件中创建Foo的子类时,您可能会意外地执行以下操作(这是尝试子类化模块并将导致错误):

import Foo
class SubclassOfFoo(Foo):

当你真的需要这样做的时候:

from Foo import Foo
class SubclassOfFoo(Foo):

或:

import Foo
class SubclassofFoo(Foo.Foo):

请注意:这个答案确实应该是对提及子类化模块的答案的评论,但由于本文中描述的StackOverflow行为,我无法将其作为评论: https://meta.stackexchange.com/questions/23211/how-do-i-add-a-comment-to-an-answer 不要因为这个而投票。

答案 3 :(得分:3)

遇到了同样的问题。最后通过仔细查看代码来解决问题,这就是警告字符串而不是代码的TypeError ...

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

“和”

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

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

相关问题