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

Dav*_*ill 43 python inheritance metaclass class

我今天早些时候试图将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
Run Code Online (Sandbox Code Playgroud)

有人可以解释这个错误吗?谢谢!

Wil*_*hen 77

您正在获得该异常,因为尽管它类似于类,但它threading.Condition是一个函数,并且您不能将函数子类化.

>>> type(threading.Condition)
<type 'function'>
Run Code Online (Sandbox Code Playgroud)

Python bugtracker上引发了这个不太有用的错误消息,但它已标记为"无法修复".

  • 另一个常见原因是从具有装饰器的基类派生时.装饰器也可以将基类的类型改为`type <'function'>`. (2认同)

Von*_*Von 27

与OP有不同的问题,但是如果你尝试从模块而不是类中继承子类,你也可以得到这个错误(例如你试图继承My.Module而不是My.Module.Class).荣誉对这篇文章帮助我弄清楚了这一点.

TypeError:调用元类库时出错

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


Ste*_*man 21

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

import Foo
class SubclassOfFoo(Foo):
Run Code Online (Sandbox Code Playgroud)

当你真的需要做的时候:

from Foo import Foo
class SubclassOfFoo(Foo):
Run Code Online (Sandbox Code Playgroud)

要么:

import Foo
class SubclassofFoo(Foo.Foo):
Run Code Online (Sandbox Code Playgroud)

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

  • 这是不要像类一样命名模块的一个很好的理由:) (2认同)