すべてのPythonクラスはオブジェクトを拡張する必要がありますか?


129

私は次の両方の仕事を見つけました:

class Foo():
    def a(self):
        print "hello"

class Foo(object):
    def a(self):
        print "hello"

すべてのPythonクラスはオブジェクトを拡張する必要がありますか?オブジェクトを拡張しないことで潜在的な問題はありますか?


2
間に差があるclass Foo():とはclass Foo:?私は、Pythonの3の作業の両方を観察したよう
ウルフ

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

回答:


117

Python 2では、継承しないobjectと古いスタイルのクラスが作成され、他の効果の中で、typeさまざまな結果が得られます。

>>> class Foo: pass
... 
>>> type(Foo())
<type 'instance'>

>>> class Bar(object): pass
... 
>>> type(Bar())
<class '__main__.Bar'>

また、多重継承のルールは、ここで要約するつもりはありませんが異なります。MIについて私が見たすべての優れたドキュメントは、新しいスタイルのクラスを説明しています。

最後に、古いスタイルのクラスはPython 3でなくなり、継承objectは暗黙的になります。したがって、古いソフトウェアとの下位互換性が必要でない限り、常に新しいスタイルのクラスを優先してください。


68

Python 3では、object自分で言ったかどうかにかかわらず、クラスは暗黙的に拡張されます。

Python 2には、古いスタイルと新しいスタイルのクラスがあります。クラスが新しいスタイルであることを示すには、から明示的に継承する必要がありますobject。そうでない場合は、古いスタイルの実装が使用されます。

通常、新しいスタイルのクラスが必要です。object明示的に継承します。これは、Python 2との互換性を目的としたPython 3コードにも適用されることに注意してください。


はい、Free Fooが指摘した違いはなくなりました、ところで、空の括弧はオプションですか?
Wolf

4
foo(object):を使用する多くのpython 3コードがあります。では、これは単なる慣例なのでしょうか?
RFV5s 2017年

2
それはあなたが明示的にPythonの2の下クラスの振る舞いがほぼ同じにするために、サブクラスのオブジェクトに必要がある場合にはPython 2と3の両方で実行するはずのコードを、かもしれ@RFVenter
blubberdiblub

@blubberdiblubこれは私が疑ったことですが、私たちのプロジェクトはpython 3.5 virtualenvでのみ実行されています。コードはpython 2プロジェクトからコピーされたはずだと思います。
RFV5s 2017年

@RFVenterうん、それは別の説明かもしれません。そしてもちろん、それがPython 3.xだけの場合は、オブジェクト参照を削除しても問題ありません。
blubberdiblub 2017年

17

Python 3では、3つの異なる方法でクラスを作成でき、内部的にはすべて同じです(例を参照)。クラスの作成方法は関係ありません。Python3のすべてのクラスは、objectという特別なクラスを継承し ます。クラスオブジェクト はPythonの基本的なクラスであり、二重下線メソッド、記述子、super()メソッド、property()メソッドなどの多くの機能を提供します。

例1。

class MyClass:
 pass

例2。

class MyClass():
 pass

例3。

class MyClass(object):
  pass

1
これは厳密には正しくないです... stackoverflow.com/questions/1238606/...
フィリップ・アドラー

あなたをフォローしているのかわかりません。そして、はい、おそらくそれが関連するまで、ほとんどの人には関係ありません。
フィリップアドラー

@PhilipAdler objectbuilt-inを参照することが一般的に想定されていますobject。CPythonの組み込み識別子を置き換えることができることを考慮する必要がある場合は、データモデルについてほとんどアサーションを作成できません。str文字列を割り当てることができるため、必ずしも文字列を引数として受け入れないことを真剣に主張できbuiltins.str = Noneますか?
ヌーノ・アンドレ

私はこれが「広く想定されている」という主張を繰り返し見ています。また、現在のすべての実装が想定していること(これは言語の要件ではない)であることに同意します。これを前提に会った、それについて知っている、またはそれを考慮したことさえある いずれにせよ、たとえそれが真実であっても、一般に想定されているという主張は、同等性が厳密には真実ではないという私の主張を無効にするものではありません。
フィリップアドラー

1

はい、すべてのPythonクラスはオブジェクト(またはここではPythonです)を拡張する必要があります。通常、重大な問題は発生しませんが、場合によっては(複数の継承ツリーの場合など)、これが重要になります。これにより、Python 3との互換性も向上します。


1
厳密に言えば、技術的にはクラシッククラスを取得できますが、これには実際の利点はなく、Python 3ではサポートされていません
max k。

なぜそれがpython3との互換性を改善するのか知りたいです。私の理解では、python3は、uが指定しなくても、オブジェクトを自動的に拡張しますよね?
Paul Lo

2
@PaulLoそうですが、オブジェクトから明示的に継承すると、Python 2とPython 3の両方で同じ(新しいスタイルの)動作が得られます。これは、Python 3の動作を変更することではなく、forward
-Python

この提案はあまり洗練されていないように見えますが、Python2とPython3を扱う場合には効果的です。しかし、実際にはどの程度関連性がありますか?
ウルフ

@ウルフそれはあなたが何をしているかに依存します。複雑な継承ツリーがある場合、それは非常に重要です。クラスを記述子にしたい場合は、new-styleを使用する必要があります。さらに詳しい情報が必要な場合は、stackoverflow.com / questions / 54867 / … からリンクをたどることができます。
pydsigner

1

他の回答がカバーしているように、オブジェクトからのPython 3の継承は暗黙的です。しかし、彼らはあなたが何をすべきか、そして何が慣習であるかを述べていません。

Python 3のドキュメントの例ではすべて、次のスタイルを使用しています。これは慣例です。今後のPython 3のコードでは、これに従うことをお勧めします。

class Foo:
    pass

出典:https : //docs.python.org/3/tutorial/classes.html#class-objects

引用例:

クラスオブジェクトは、属性参照とインスタンス化の2種類の操作をサポートしています。

属性参照は、Pythonでのすべての属性参照に使用される標準構文obj.nameを使用します。有効な属性名は、クラスオブジェクトが作成されたときにクラスの名前空間にあったすべての名前です。したがって、クラス定義が次のようになったとします。

class MyClass:
    """A simple example class"""
    i = 12345

    def f(self):
        return 'hello world'

別の引用:

一般的に言って、インスタンス変数は各インスタンスに固有のデータ用であり、クラス変数はクラスのすべてのインスタンスで共有される属性とメソッド用です。

class Dog:

    kind = 'canine'         # class variable shared by all instances

    def __init__(self, name):
        self.name = name    # instance variable unique to each instance

0

python3では違いはありませんが、python2では拡張しないobjectことで古いスタイルのクラスが得られます。古いスタイルのクラスよりも新しいスタイルのクラスを使用したい。


2
この答えは合理的ですが、他の回答者はより早く、そして/またはより詳細にそこに行きました。この答えは、現状のページに価値を追加するものではありません。
Mark Amery 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.