2009-08-06 8 views
48

古いPythonバージョンでは、Pythonでクラスを作成するときに、オブジェクトから継承することができます。これは、オブジェクトを新しいスタイルのオブジェクトにするための特別なビルトインPython要素です。Python 3.xでPythonのオブジェクトを継承することは必要なの?

新しいバージョン(> 3.0および2.6)はどうですか?私はクラスのオブジェクトについてのグーグルでは、私は非常に多くの結果を得る(明らかな理由のため)。何かヒント?

ありがとうございました!

+2

コードが2.xでも使用されている場合は、明示的にするとよいでしょう。 – smci

答えて

39

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

+0

ありがとうございました:)私はオンラインブック(Pythonのバイト)とPyhtonの文書をたくさん見ましたが、私の答えは決して見つけられませんでした... – thomas

+0

Python 2.6についてはどうですか? – luc

+3

Python 2.6はPython 2.xとして動作する – SilentGhost

22

これは古い質問であることを認識していますが、Python 3でもこの2つのことは全く同じではありません。

objectから明示的に継承した場合、実際に何をしているのかは、時刻が何であるかにかかわらず、builtins.objectから継承されます。

したがって、何らかの理由でオブジェクトをオーバーライドする(非常にばかげた)モジュールがある可能性があります。これは私たちが実際にすることができます(第3のファイルに続いて

class Greeter(object): 
    pass 

class NonGreeter: 
    pass 

:いくつかの他のファイル( "klasses.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 

:私たちは、この最初のモジュール "newobj.py" と呼ぶことにします)を実行します。

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 

だから、あなたはそれが明示的にオブジェクトから継承している場合には、我々はあなたが暗黙の継承を許可する場所とは異なる動作を取得、ことがわかります。

+4

狂気のためのUpvote!素晴らしい考え! –