web-dev-qa-db-ja.com

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

古いpythonバージョンでは、Pythonでクラスを作成すると、それはobjectから継承できます。これは、特別な組み込みpython要素。

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

感謝!

85
thomas

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

78
SilentGhost

これは古い質問であることは承知していますが、python 3 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

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

67
Philip Adler