5

私はPython言語に比較的慣れていないため、次のことを行っているときにこれに遭遇しました。

help(list)

これが私が遭遇したものです:

__add__(...)
|      x.__add__(y) <==> x+y
|  
|  __contains__(...)
|      x.__contains__(y) <==> y in x
|  
|  __delitem__(...)
|      x.__delitem__(y) <==> del x[y]

これらに関して、アンダースコアは何のためですか? メソッドを通常使用する場合は (私の知る限り) 使用されないため、ドキュメントでアンダースコアを使用してそれらを記述するのに時間がかかる理由を理解するのに苦労しています。

4

6 に答える 6

10

包括的な説明については、Python スタイル ガイドを参照してください。

実際には:

the following special forms using leading or trailing
underscores are recognized (these can generally be combined with any case
convention):

- _single_leading_underscore: weak "internal use" indicator.  E.g. "from M
  import *" does not import objects whose name starts with an underscore.

- single_trailing_underscore_: used by convention to avoid conflicts with
  Python keyword, e.g.

  Tkinter.Toplevel(master, class_='ClassName')

- __double_leading_underscore: when naming a class attribute, invokes name
  mangling (inside class FooBar, __boo becomes _FooBar__boo; see below).

- __double_leading_and_trailing_underscore__: "magic" objects or
  attributes that live in user-controlled namespaces.  E.g. __init__,
  __import__ or __file__.  Never invent such names; only use them
  as documented.
于 2011-02-16T13:56:03.130 に答える
3

メソッド名をアンダースコアで囲むことは、名前空間を区切る方法にすぎません。メソッドがアンダースコアで始まり、アンダースコアで終わる場合、それはメソッドが外部コードによって使用されることを意図していないことを示す単なる規則です。

あなたが投稿した宣伝文は、help(list)単に Python の構文を使用して と言うとe in lst、実際に を呼び出していることを意味しますlst.__contains__(e)

于 2011-02-16T13:53:26.183 に答える
2

以下は、Python の作成者である Guido van Rossum が、二重下線の使用について説明しています

... 特別な種類のクラス メソッド (イニシャライザやデストラクタなど) の新しい構文を考案するのではなく、これらの機能は、ユーザーに initdelなどの特別な名前のメソッドを実装するよう要求するだけで処理できると判断しました。前方へ。この命名規則は C から取られたもので、アンダースコアで始まる識別子はコンパイラによって予約されており、特別な意味を持つことがよくあります (たとえば、 C プリプロセッサのFILEなどのマクロ)。

...

また、この手法を使用して、ユーザー クラスが Python の演算子の動作を再定義できるようにしました。前述のように、Python は C で実装され、関数ポインタのテーブルを使用して、組み込みオブジェクトのさまざまな機能を実装します (たとえば、「属性の取得」、「追加」、および「呼び出し」)。これらの機能をユーザー定義クラスで定義できるようにするために、さまざまな関数ポインターを getattraddcallなどの特別なメソッド名にマップしました。これらの名前と、C で新しい Python オブジェクトを実装するときに定義する必要がある関数ポインターのテーブルとの間には、直接的な対応があります。

一部を読む特別なメソッド名に関する Python ドキュメントも参照してください。

クラスは、特別な名前でメソッドを定義することにより、特別な構文 (算術演算、添え字付け、スライスなど) によって呼び出される特定の操作を実装できます。これは、演算子のオーバーロードに対する Python のアプローチであり、クラスが言語演算子に関して独自の動作を定義できるようにします。

于 2011-02-16T14:58:42.303 に答える
0

それらは特別なメソッドです ("dunder" (2 つのアンダースコア) が特別なわけではありませんが、ほとんどの場合、特別な意味があります)。多くの場合、演算子を使用するときに呼び出されます。クラスの動作を上書きできます。

たとえば、クラスがある場合C、定義することにより

class C:
    def __add__(self, other):
        #....
        return something

クラスから 2 つのインスタンスを追加するとどうなるかを定義できます。

val = instance1 + instance2
于 2011-02-16T13:55:36.160 に答える
0

ある程度、これらの下線は特別なものではありません。それらはメソッド名の一部にすぎません。

ただし、コンストラクターやオーバーロードされた演算子などの「魔法の」メソッドを示すために使用されます。これらを独自のメソッド名で使用しないでください。PEP 8から:

  • __double_leading_and_trailing_underscore__: ユーザー制御の名前空間に存在する「魔法の」オブジェクトまたは属性。例えば__init____import__または__file__。そのような名前を発明しないでください。文書化されたとおりにのみ使用してください。

これらを直接呼び出す必要はほとんどありません。例えば:

  • MyClass(...)を呼び出しますMyClass.__init__(...)
  • a + bを呼び出しますa.__plus__(b)
  • str(a)を呼び出しますa.__str__()
于 2011-02-16T13:55:48.563 に答える
0

この場合、2 つのアンダースコアは、特別なメソッド (シンタックス シュガーの目的やその他の特別なインターフェイスをサポートするために実装されるメソッド) を示す慣例として使用されます。

http://docs.python.org/reference/datamodel.html#specialnames

于 2011-02-16T13:56:05.550 に答える