パラメータとしてオブジェクトを持つクラス


114

一部のpythonコードをscalaコードに変換しようとしています。だから私はPythonの完全な初心者です。

しかし、なぜいくつかのクラスはオブジェクトをパラメーターとして持っているのにそれを明示的に使用しないのですか?そもそもそれをパラメーターとして持つ理由は何ですか?

例:

class Table(object)

お時間をいただきありがとうございます。


回答:


112

Python2では、これは(「クラシック」クラスではなく)新しいスタイルのクラスでTableあると宣言します。Python3では、すべてのクラスが新しいスタイルのクラスであるため、これは不要になりました。

新しいスタイルのクラスには、クラシッククラスにはないいくつかの特別な属性があります。

class Classic: pass
class NewStyle(object): pass

print(dir(Classic))
# ['__doc__', '__module__']

print(dir(NewStyle))
# ['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']

また、プロパティスーパーはクラシッククラスでは機能しません。

Python2では、すべてのクラスを新しいスタイルのクラスにすることをお勧めします。(標準ライブラリのクラスの多くは、下位互換性のために、依然としてクラシッククラスですが)。

一般的に、

class Foo(Base1, Base2):

Fooは、基本クラスBase1およびから継承するクラスとして宣言されていBase2ます。

objectPythonのすべてのクラスの母です。新しいスタイルのクラスなので、から継承objectするTableと新しいスタイルのクラスになります。


Python3のパラメーターとしてオブジェクトが不要であることに言及しているソースに私をリダイレクトできますか?見つけられないようです。ありがとう

1
StackOverflow(ここでは例)で何度も言及されていますが、ドキュメントでこれに関する簡単な宣言を見つけることができませんでした。これは、チュートリアルで暗黙的に(objectクラスベースのリストからの省略により)示されています。
unutbu 2017年

1
また、Python3のドキュメントでは、「新しいスタイルのクラス」は「現在すべてのクラスオブジェクトに使用されているクラスのフレーバーの古い名前」であると述べています(私の強調)。また、Python2のドキュメントでは、「新しいスタイルのクラス」はから継承するクラスであると述べていobjectます。2つのステートメントをまとめるとobject、すべてのクラスはPython3の新しいスタイルのクラスであるため、Python3のクラスベースのリストに含める必要はありません。
unutbu 2017年

21

Tableクラスはというクラスを拡張していobjectます。それは議論ではありません。object明示的に拡張する理由は、クラスを新しいスタイルのクラスに変換するためです。extendsを明示的に指定しない場合object、Python 3まではデフォルトで古いスタイルのクラスになります。(Python 3以降、明示的に拡張するかどうかにかかわらobjectず、すべてのクラスは新しいスタイルです。)

新しいスタイルのクラスと古いスタイルのクラスの詳細については、この質問参照してください。


1
これはより簡単で簡潔な答えです。ありがとう。
Sabuncu 2014年

3

「新しいスタイル」と「古いスタイル」のクラスの違いはPython 2.xに固有であることに注意してください。3.xでは、すべてのクラスが「新しいスタイル」です。


2

クラスTableとクラスTable(object)はPythonでも同じです。

これはパラメーターではなく、オブジェクト(他の多くの言語と同様に基本クラス)から拡張されたものです。

それが言うすべてはそれが「オブジェクト」で定義されたものを継承するということです。これがデフォルトの動作です。


3
自動的に拡張するクラスobjectは、Python 3のみのデフォルトの動作です。Python 2では、クラス拡張オブジェクトには、オブジェクトを拡張しないクラスにはない属性があります。
Lewis Ellis

1

オブジェクトは、Pythonで定義されているクラスオブジェクトの最も基本的なタイプです。オブジェクトの属性は以下のように見ることができます

** >>> dir(オブジェクト)

[' class '、 ' delattr '、 ' doc '、 ' format '、 ' getattribute '、 ' hash '、 ' init '、 ' new '、 ' reduce '、 ' reduce_ex '、 ' repr '、 ' setattr '、 ' sizeof '、' str '、' サブクラスフック '] **

したがって、Table(object)は単なる継承です。


0

1)クラス名(オブジェクト):2)クラス名:どちらも同じですが、最初の方が書き込みの点で非常に優れています。

どのように同じですか?したがって、Pythonのすべてのものがオブジェクトの下にあるということは、Pythonのすべてのものがオブジェクトのプロパティを持っていることを意味します。最初は明示的に、2番目は明示しませんでした。


これはPython 2には当てはまりません。詳細については、承認済みの回答を参照してください。
niemmi 16
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.