【问题标题】:Error when calling the metaclass bases: function() argument 1 must be code, not str调用元类库时出错:function() 参数 1 必须是代码,而不是 str
【发布时间】:2011-01-14 22:38:06
【问题描述】:

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

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

【问题讨论】:

    标签: python class inheritance metaclass


    【解决方案1】:

    您会遇到该异常,因为尽管 threading.Condition 的名称类似于类,但它是一个函数,并且您不能子类化函数。

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

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

    【讨论】:

    • 奇怪,我没想到要检查它的类型。文档似乎有点误导,因为他们说 (docs.python.org/library/threading.html) "class threading.Condition([lock])" 这似乎有点误导。无论如何,感谢您清除这个:)。
    • 我在错误地将模块用作基类时也看到了这一点:类 Command(main.cmdroot.list.hosts) 而不是正确的 Command(main.cmdroot.list.hosts.Command)
    • 另一个常见原因是从具有装饰器的基类派生时。装饰器也可以将基类的类型更改为type &lt;'function'&gt;
    • 有时我不小心写了def MyClass 而不是class MyClass,这会导致同样的错误(等等)。
    • “你不能继承函数” - 感谢您对此的明确回答。我希望错误信息是这样说的。
    【解决方案2】:

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

    TypeError:调用元类库时出错

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

    【讨论】:

    • 当您尝试从 def MyClass(object) 继承而不是从 class MyClass(object) 继承时
    【解决方案3】:

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

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

    import Foo
    class SubclassOfFoo(Foo):
    

    当你真的需要这样做时:

    from Foo import Foo
    class SubclassOfFoo(Foo):
    

    或:

    import Foo
    class SubclassofFoo(Foo.Foo):
    

    【讨论】:

    • 这是一个很好的理由不将你的模块命名为类:)
    • 是的,这是为我做的,我的模型和类名相同。
    • 在子类化时输入def(当你的意思是class)时也会发生这种情况,而且你太累了,看不到它。
    【解决方案4】:

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

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

    “和”

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

    请注意,特定错误是由于代码“Model”的单个小写字母导致它成为字符串

    【讨论】:

    • “这又使它成为一个字符串”,小写单词在python中不会自动成为字符串
    猜你喜欢
    • 2019-10-29
    • 2017-07-24
    • 2022-11-11
    • 2017-10-21
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    • 2022-11-21
    • 2020-04-02
    相关资源
    最近更新 更多