Python 调用元类基时出错:function()参数1必须是code,而不是str

Python 调用元类基时出错:function()参数1必须是code,而不是str,python,class,inheritance,metaclass,Python,Class,Inheritance,Metaclass,今天早些时候,我尝试将threading.Condition子类化,但没有成功。下面是当我尝试对threading.Condition类进行子类化时Python解释器的输出: >>> import threading >>> class ThisWontWork(threading.Condition): ... pass ... Traceback (most recent call last): File "<stdin>", l

今天早些时候,我尝试将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
导入线程 >>>分类ThisWonWork(线程。条件): ... 通过 ... 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 TypeError:调用元类基时出错 function()参数1必须是代码,而不是str
有人能解释这个错误吗?谢谢

之所以会出现这种异常,是因为,尽管其名称类似于类,
threading.Condition
是一个函数,您不能对函数进行子类化

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

这条错误消息没有太大帮助,但它被标记为“不会修复”。

与OP的问题不同,但是如果您尝试从模块而不是类中创建子类(例如,您尝试继承My.module而不是My.module.class),也会出现此错误。谢谢你帮我解决了这个问题

TypeError:调用元类基时出错

对于这一个,答案是您可能将一个python类命名为 与它所在的模块(即文件)相同。那你呢 导入模块并尝试将其作为类使用。是你干的 因为你和我一样,可能是一个Java程序员,时间不长 前:-)。解决方法是导入module.class而不是 只是模块。或者,为了理智起见,更改类的名称 或者模块,以便更清楚地了解导入的内容


关于模块的子类化,如果您在文件Foo.py中定义了类Foo,那么这是一个非常容易犯的错误

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

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

from Foo import Foo
class SubclassOfFoo(Foo):
或:


陷入了同样的问题。通过仔细查看代码最终解决了这个问题,这就是产生关于字符串而不是代码的报警的
TypeError

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


请注意,由于代码“Model”中只有一个小写字母,因此产生了特定的错误,这反过来又使它成为一个字符串

,奇怪的是,我不想检查它的类型。文档似乎有点误导,因为它们说()“class threading.Condition([lock]),这似乎有点误导。无论如何,感谢您澄清这一点:)。当错误地将模块用作基类时,我也看到了这一点:类命令(main.cmdroot.list.hosts)而不是正确的命令(main.cmdroot.list.hosts.Command)另一个常见原因是从具有装饰器的基类派生。装饰程序可能会将基类的类型也更改为
类型
。有时我会意外地编写
def MyClass
而不是
class MyClass
,这会导致相同的错误(以及其他错误)。“您不能对函数进行子类化”-感谢您给出了明确的答案。我希望错误消息是这样的。这是一个不将模块命名为类的很好的理由:)是的,这对我来说是这样的,我的模型和类名是相同的。另外,当您尝试从
def MyClass(object)
而不是从
class MyClass(object)
import Foo
class SubclassofFoo(Foo.Foo):
Class Class_name(models.model): //(gives a TypeError of 'str' type) 
Class Class_name(models.Model): // is the correct one.