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 バグトラッカーで取り上げられましたが、「修正されません」とマークされています。

于 2010-02-09T18:31:36.627 に答える
30

OPとは異なる問題がありましたが、クラスではなくモジュールからサブクラス化しようとすると(たとえば、My.Module.ClassではなくMy.Moduleを継承しようとすると)、このエラーが発生する可能性があります。私がこれを理解するのを手伝ってくれたこの投稿への称賛。

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 に答える