[解決済み] super() は、新しいスタイルのクラスに対して "TypeError: must be type, not classobj" を送出する。
質問
の次のような使い方があります。
super()
はTypeErrorを発生させます:なぜでしょうか?
>>> from HTMLParser import HTMLParser
>>> class TextParser(HTMLParser):
... def __init__(self):
... super(TextParser, self).__init__()
... self.all_data = []
...
>>> TextParser()
(...)
TypeError: must be type, not classobj
StackOverflowにも同様の質問があります。
Python super() は TypeError を発生させます。
このエラーは、ユーザークラスが新スタイルのクラスでないことが原因であると説明されています。 しかし、上記のクラスは、以下のクラスを継承しているため、新スタイルのクラスです。
object
:
>>> isinstance(HTMLParser(), object)
True
何が足りないのだろう?どうすれば
super()
ということでしょうか?
使用方法
HTMLParser.__init__(self)
の代わりに
super(TextParser, self).__init__()
はうまくいくのですが、TypeErrorを理解したいのです。
追記:Joachimは、新しいスタイルクラスのインスタンスであることは、新しいスタイルクラスのインスタンスであることと同等ではないことを指摘しました。
object
. 私は何度も反対のことを読んだので、混乱してしまいました(新スタイルのクラスインスタンスのテスト例で
object
インスタンステストです。
https://stackoverflow.com/revisions/2655651/3
).
解決方法は?
さてさて、いつもの"です。
super()
は旧式のクラスで使用できません"。
ただし、重要なのは 正しいテスト これは新しいスタイルなのか? インスタンス (つまり、オブジェクト)?"です。
>>> class OldStyle: pass
>>> instance = OldStyle()
>>> issubclass(instance.__class__, object)
False
となっており、(質問のように)なっていない。
>>> isinstance(instance, object)
True
について クラス であれば、正しい "is this a new-style class" のテストは。
>>> issubclass(OldStyle, object) # OldStyle is not a new-style class
False
>>> issubclass(int, object) # int is a new-style class
True
は
肝心な点
は、古いスタイルのクラスでは
クラス
インスタンスとその
タイプ
は区別されます。ここで
OldStyle().__class__
は
OldStyle
を継承していない
object
一方
type(OldStyle())
は
instance
タイプで、これは
する
を継承しています。
object
. 基本的に、古いスタイルのクラスは、ただ単に
instance
(一方、新スタイルのクラスは、クラス自身を型とするオブジェクトを作成します)。このためか、インスタンス
OldStyle()
は
object
: その
type()
を継承しています。
object
(そのクラスが行うのは
ではなく
を継承しています。
object
はカウントされません: 古いスタイルのクラスは、単に
instance
). 部分的に参照する。
https://stackoverflow.com/a/9699961/42973
.
追記:新スタイルのクラスと旧スタイルのクラスの違いも一緒に見ることができます。
>>> type(OldStyle) # OldStyle creates objects but is not itself a type
classobj
>>> isinstance(OldStyle, type)
False
>>> type(int) # A new-style class is a type
type
(旧式のクラスは ではなく 型であるため、そのインスタンスの型になることはできません)。
関連
-
Python Decorator 練習問題
-
Python 人工知能 人間学習 描画 機械学習モデル作成
-
pythonサイクルタスクスケジューリングツール スケジュール詳解
-
[解決済み】TypeError: unhashable type: 'numpy.ndarray'.
-
[解決済み】syntaxError: 'continue' がループ内で適切に使用されていない
-
[解決済み】インポートエラー。モジュール名 urllib2 がない
-
[解決済み] 'int'オブジェクトに'__getitem__'属性がない。
-
[解決済み】Python: SyntaxError: キーワードは式になり得ない
-
[解決済み】NameError: 名前 'self' が定義されていません。
-
[解決済み】super()がエラーで失敗する。親がオブジェクトを継承していない場合、TypeError "argument 1 must be type, not classobj" が発生する。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Python 人工知能 人間学習 描画 機械学習モデル作成
-
Pythonの学習とデータマイニングのために知っておくべきターミナルコマンドのトップ10
-
pyCaret効率化乗算器 オープンソース ローコード Python機械学習ツール
-
Pythonの@decoratorsについてまとめてみました。
-
Python Pillow Image.save jpg画像圧縮問題
-
[解決済み】TypeErrorの修正方法。Unicodeオブジェクトは、ハッシュ化する前にエンコードする必要がある?
-
[解決済み】「RuntimeError: dictionary changed size during iteration」エラーを回避する方法とは?
-
[解決済み】socket.error: [Errno 48] アドレスはすでに使用中です。
-
[解決済み】TypeError: re.findall()でバイトのようなオブジェクトに文字列パターンを使用することはできません。)
-
[解決済み】Python - "ValueError: not enough values to unpack (expected 2, got 1)" の修正方法 [閉店].