[解決済み] Pythonのクラスはなぜオブジェクトを継承するのですか?
質問
を継承するクラス宣言は、何か理由があるのでしょうか?
object
?
これを行うコードを見つけたのですが、その理由がわかりません。
class MyClass(object):
# class code follows...
解決方法は?
<ブロッククオート
を継承するクラス宣言は、何か理由があるのでしょうか?
object
?
Python 3では、Python 2と3の間の互換性は別として。 理由なし . Python 2の場合。 多くの理由 .
Python 2.xの話。
Python 2.x (2.2以降) では、クラスには
object
をベースクラスとします。
-
クラシックスタイル クラスは
object
を基本クラスとする。>>> class ClassicSpam: # no base class ... pass >>> ClassicSpam.__bases__ ()
-
新規スタイル クラスは、直接 または間接的に (を継承する)。 組み込み型 ),
object
を基本クラスとする。>>> class NewSpam(object): # directly inherit from object ... pass >>> NewSpam.__bases__ (<type 'object'>,) >>> class IntSpam(int): # indirectly inherit from object... ... pass >>> IntSpam.__bases__ (<type 'int'>,) >>> IntSpam.__bases__[0].__bases__ # ... because int inherits from object (<type 'object'>,)
間違いなく、クラスを書くときは 常に 新しいスタイルのクラスにしたい。そうすることで得られる特典は数多くありますが、そのいくつかを挙げてみましょう。
-
記述子への対応 . 具体的には、以下のような構成が記述子によって可能となる。
-
classmethod
: インスタンスの代わりにクラスを暗黙の引数として受け取るメソッドです。 -
staticmethod
: 暗黙の引数を受け取らないメソッドself
を第一引数にとります。 -
プロパティに
property
: 属性の取得、設定、削除を管理する関数を作成します。 -
__slots__
: クラスのメモリ消費を抑え、属性へのアクセスを高速化します。もちろん 制限を課す .
-
-
は
__new__
静的メソッド: 新しいクラスインスタンスを作成する方法をカスタマイズできます。 -
メソッド解決命令(MRO) : どのメソッドを呼び出すかを決定する際に、クラスの基底クラスをどのような順序で検索するか。
-
MRO関連。
super
コール . もご覧ください。super()
をスーパーと見なした。
を継承していない場合は
object
は忘れてください。前出の箇条書きと "new"スタイル クラスの他の特典について、より詳細な説明を以下に示します。
こちら
.
新スタイルのクラスの欠点は、クラス自体のメモリ消費量が増えることです。多くのクラスオブジェクトを作成しない限り、これが問題になるとは思えませんし、プラスの海に沈むマイナスではありますが。
Python 3.xの話。
Python 3では、物事が単純化されています。新しいスタイルのクラスしか存在しないので(単にクラスと呼ばれる)、唯一の違いは
object
は、8文字多く入力する必要があります。これです。
class ClassicSpam:
pass
はこれと完全に等価です(名前は別として :-)。
class NewSpam(object):
pass
を、このようにします。
class Spam():
pass
全てに
object
の中に、その
__bases__
.
>>> [object in cls.__bases__ for cls in {Spam, NewSpam, ClassicSpam}]
[True, True, True]
では、どうすればいいのでしょうか?
Python 2で。
は常に
object
明示的に
. 特典を取得する。
Python 3で。
を継承しています。
object
Pythonに依存しないコードを書いている場合、つまり、Python 2とPython 3の両方で動作する必要がある場合です。そうでなければ、Pythonが裏で挿入してくれるから、違いはないんだ。
関連
-
[解決済み] _tkinter.TclError: 表示名がなく、$DISPLAY環境変数もない。
-
[解決済み】 AttributeError("'str' object has no attribute 'read'")
-
[解決済み] JavaScriptでオブジェクトをディープクローンする最も効率的な方法は何ですか?
-
[解決済み] PandasでDataFrameの行を反復処理する方法
-
[解決済み] リストを均等な大きさの塊に分割するには?
-
[解決済み] Python 3で「1000000000000000 in range(1000000000000001)」はなぜ速いのですか?
-
[解決済み] C#でベースコンストラクタを呼び出す
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] Pythonでシングルトンを作成する
-
[解決済み】Pythonに三項条件演算子はありますか?
最新
-
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機械学習Githubが8.9Kstarsに達したモデルインタープリタLIME
-
Python百行で韓服サークルの画像クロールを実現する
-
Pythonコードの可読性を向上させるツール「pycodestyle」の使い方を詳しく解説します
-
任意波形を生成してtxtで保存するためのPython実装
-
[解決済み】TypeError: unhashable type: 'numpy.ndarray'.
-
[解決済み] データ型が理解できない
-
[解決済み】TypeError: re.findall()でバイトのようなオブジェクトに文字列パターンを使用することはできません。)
-
[解決済み】「SyntaxError.Syntax」は何ですか?Missing parentheses in call to 'print'」はPythonでどういう意味ですか?
-
[解決済み】syntaxError: 'continue' がループ内で適切に使用されていない
-
[解決済み] Pythonのクラスはすべてobjectを継承すべきなのか?重複