2013-09-22 15 views
7

私はobject()の組み込み関数をどのように使用するのか把握しようとしています。引数はなく、すべてのPythonクラスに共通する型の「フィーチャーレスオブジェクト」を返します。また、すべてのPythonクラスに共通するすべてのメソッドを持っています。あなたはそれをプログラムする必要がない場合であってもジャック・スケリントン、WHAT. IS. THIS?object()ビルトインはいつ便利ですか?

+0

これは関数として使用することを意図していません。基本クラスとして使用することを意図しています。 – refi64

+0

Python 3で?どうして?私はそれから何を得るでしょうか?クラスは自動的にこれらのメソッドを継承しますか? – Aerovistae

+3

私はあなたが与えるドキュメンテーションのリンクの中で、どのように再帰的にそれ自身を指すハイパーリンクされたテキストを持っているのか面白いと思います。 – Shashank

答えて

11

を引用する

objectは、目的を果たす:それは他のすべてのオブジェクトが導出される一般的なクラスです。これは、mromethod resolution order)メソッドによってリストされた最後のクラスです。この概念には名前とオブジェクトが必要です。objectがこの目的に役立ちます。

objectの別の用途は、sentinelsを作成することです。

sentinel = object() 

これは、多くの場合、マルチスレッドプログラミングで使用されている - signal a termination eventへ - キューを通過しました。キューハンドラがこれらの値を処理する引数として解釈する必要がある場合があるので、Noneまたは他の値を送信したくない場合があります。プログラムの他の部分が生成しないような独自の価値が必要です。

このようにセンチネルを作成することで、通常のキュー値ではないことが確実なこのような一意のオブジェクトが提供されるため、特別なイベントの信号としてテストして使用することができます。クラスやインスタンス、関数などを作成するなどの可能性もありますが、これらのすべての代替案は大きく、リソースが重く、曖昧ではなくobject()となります。

4

ドット(特に__setattr__)を上書きする場合に最も便利です。再帰を中断することができます。例:

class SomeClass(object): 
    def __setattr__(self, name, value): 
     if name not in ('attr1', 'attr2', 'attr3', 'attr4'): 
      object.__setattr__(self, name, value) 
     else: 
      do_something_else() 
+1

Stack Exchangeへようこそ!ここであなたの[カーニバルイベントガイド](http://stackexchange.com/sites) – Aerovistae

+0

私は、 'super()'の代わりに 'object'のメソッドを直接呼び出すことを避けるのが一般的でした。 1つの理由は、協調的な多重継承を可能にするということです。 'object'クラスは、' super() '呼び出しが最終的に到達する最終的な基本クラスであるため、もちろん関与しますが、明示的に名前を付ける必要はありません。 – Blckknght

+0

@Blckknghtしかし、私は一般的にあなたに同意します。しかし、再帰を壊す場合は、通常、スーパークラスによって引き起こされた再帰を中断しようとしています。これは私が(一般的に)明示的にobjectを使用する1つのユースケースです。 – Tritium21

関連する問題