Python 3.xでPythonのオブジェクトから継承する必要があるか、それとも役に立ちますか?


92

古いバージョンのpythonでは、pythonでクラスを作成すると、オブジェクトから継承できます。これは、オブジェクトを新しいスタイルのオブジェクトにできるようにする特別な組み込みpython要素を理解している限りです。

新しいバージョン(> 3.0および2.6)についてはどうですか?私はクラスオブジェクトについてグーグルで検索しましたが、(明らかな理由により)多くの結果が得られました。ヒントはありますか?

感謝!


2
コードが2.xでも使用される場合は、明示的にすることをお勧めします。
smci

1
それはこの質問でよく答えられています:stackoverflow.com/questions/4015417/…–
nngeek

回答:


89

objectPython 3で新しいスタイルを使用するために、から継承する必要はありません。すべてのクラスは新しいスタイルです。


5
ご注意この手段は、すべてのクラスから継承することをobject明示的に入力した場合にかかわらず、(object)ではないのPython 3.1でまたは
u0b34a0f6ae

8
必須ではありませんが、「PythonコードをPython 3に移植する」では、コードは引き続き有効であると記載されています。docs.python.org / py3k
ハイパーボア

nngeekのコメントで言及されたこの投稿から、古いスタイルと新しいスタイルの良い安定した参照のようです(本当にPy2にのみ関連しています):docs.python.org/2/reference/…-上記のリンクは持っているようです以来変更されました。
Eric Cousineau

76

これは古い質問だと思いますが、python 3でもこれら2つはまったく同じではないことに注意してください。

から明示的に継承する場合object、実際に実行しているのは、その時点で何を指しているかに関係なく、から継承builtins.object することです。

したがって、何らかの理由でオブジェクトをオーバーライドする(非常に奇抜な)モジュールを使用できます。この最初のモジュールを「newobj.py」と呼びます。

import builtins

old_object = builtins.object  # otherwise cyclic dependencies

class new_object(old_object):

    def __init__(self, *args, **kwargs):
        super(new_object, self).__init__(*args, **kwargs)
        self.greeting = "Hello World!" 

builtins.object = new_object  #overrides the default object

次に、他のファイル( "klasses.py")で:

class Greeter(object):
    pass

class NonGreeter:
    pass

次に、3番目のファイル(実際に実行できます):

import newobj, klasses  # This order matters!

greeter = klasses.Greeter()
print(greeter.greeting)  # prints the greeting in the new __init__

non_greeter = klasses.NonGreeter()
print(non_greeter.greeting) # throws an attribute error

つまり、オブジェクトから明示的に継承している場合、暗黙的な継承を許可している場合とは異なる動作をすることがわかります。


1
これは、元の質問と(正しい)回答の邪魔になる役に立たないコメントです。もちろん、ビルトインを変更すると、動作が異なります。そんなことしないで。
harmv

11
一般的に、動作は同等であることが期待されているため、これは重要です。それは同等ではないので、私の観察です。
フィリップアドラー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.