498

この「下線」は頻繁に発生するようですが、これはPython言語の要件なのか、それとも単なる慣例の問題なのか疑問に思いました。

また、誰かが名前を付けて、どの関数にアンダースコアが付いている傾向があるのか​​、そしてその理由(__init__たとえば)を説明できますか?

4

6 に答える 6

661

Python PEP 8から-Pythonコードのスタイルガイド:

記述的:命名スタイル

先頭または末尾の下線を使用する次の特殊な形式が認識されます(これらは通常、任意の大文字小文字の規則と組み合わせることができます)。

  • _single_leading_underscore:弱い「内部使用」インジケータ。たとえばfrom M import *、名前がアンダースコアで始まるオブジェクトはインポートされません。

  • single_trailing_underscore_:Pythonキーワードとの競合を回避するために、慣例により使用されます。例:

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

  • __double_leading_underscore:クラス属性に名前を付けるとき、名前マングリングを呼び出します(クラスFooBar内で、以下に__booなり_FooBar__booます;以下を参照)。

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

先頭と末尾にアンダースコアが2つ付いている名前は、基本的にPython自体のために予約されていることに注意してください。

于 2011-12-31T19:01:13.273 に答える
70

他の回答者は、「特別な」または「魔法の」方法の命名規則として、二重の先頭と末尾のアンダースコアを説明するのに正しいです。

これらのメソッドを直接呼び出すこともできますが([10, 20].__len__()たとえば)、下線の存在は、これらのメソッドが間接的に呼び出されることを意図していることを示唆しています(len([10, 20])たとえば)。ほとんどのPython演算子には、関連する「魔法の」メソッドがあります(たとえば、a[x]通常の呼び出し方法ですa.__getitem__(x))。

于 2011-12-31T20:05:11.970 に答える
25

二重アンダースコアで囲まれた名前は、Pythonにとって「特別な」ものです。これらは、 Python言語リファレンスのセクション3「データモデル」にリストされています。

于 2011-12-31T19:01:20.187 に答える
6

実際、親クラス名と子クラス名を区別する必要がある場合は、_メソッド名を使用します。親子クラスを作成するこの方法を使用したいくつかのコードを読みました。例として、私はこのコードを提供することができます:

class ThreadableMixin:
   def start_worker(self):
       threading.Thread(target=self.worker).start()

   def worker(self):
      try:
        self._worker()
    except tornado.web.HTTPError, e:
        self.set_status(e.status_code)
    except:
        logging.error("_worker problem", exc_info=True)
        self.set_status(500)
    tornado.ioloop.IOLoop.instance().add_callback(self.async_callback(self.results))

..。

と_workerメソッドを持つ子

class Handler(tornado.web.RequestHandler, ThreadableMixin):
   def _worker(self):
      self.res = self.render_string("template.html",
        title = _("Title"),
        data = self.application.db.query("select ... where object_id=%s", self.object_id)
    )

..。

于 2015-08-30T16:43:54.503 に答える
5

Pythonでの__の使用を理解するための例を追加しました。これがすべてのリストです__

https://docs.python.org/3/genindex-all.html#_

特定のクラスの識別子(キーワード以外)には特別な意味があります。明示的に文書化された使用に従わない他のコンテキストでの*名の使用は、警告なしに破損する可能性があります

__を使用したアクセス制限

"""
Identifiers:
-  Contain only (A-z, 0-9, and _ )
-  Start with a lowercase letter or _.
-  Single leading _ :  private
-  Double leading __ :  strong private
-  Start & End  __ : Language defined Special Name of Object/ Method
-  Class names start with an uppercase letter.
-

"""


class BankAccount(object):
    def __init__(self, name, money, password):
        self.name = name            # Public
        self._money = money         # Private : Package Level
        self.__password = password  # Super Private

    def earn_money(self, amount):
        self._money += amount
        print("Salary Received: ", amount, " Updated Balance is: ", self._money)

    def withdraw_money(self, amount):
        self._money -= amount
        print("Money Withdraw: ", amount, " Updated Balance is: ", self._money)

    def show_balance(self):
        print(" Current Balance is: ", self._money)


account = BankAccount("Hitesh", 1000, "PWD")  # Object Initalization

# Method Call
account.earn_money(100)

# Show Balance
print(account.show_balance())

print("PUBLIC ACCESS:", account.name)  # Public Access

# account._money is accessible because it is only hidden by convention
print("PROTECTED ACCESS:", account._money)  # Protected Access

# account.__password will throw error but account._BankAccount__password will not
# because __password is super private
print("PRIVATE ACCESS:", account._BankAccount__password)

# Method Call
account.withdraw_money(200)

# Show Balance
print(account.show_balance())

# account._money is accessible because it is only hidden by convention
print(account._money)  # Protected Access
于 2020-01-28T12:07:24.130 に答える
2

この規則は、やなどの特殊な変数またはメソッド(いわゆる「マジックメソッド」)に使用され__init__ます__len__。これらのメソッドは、特別な構文機能を提供したり、特別なことを実行したりします。

たとえば、__file__Pythonファイルの場所を示し、式の__eq__実行時にa == b実行されます。

もちろん、ユーザーはカスタムの特殊メソッドを作成できますが、これは非常にまれなケースですが、多くの場合、組み込みの特殊メソッドの一部を変更する可能性があります(たとえば、クラス__init__のインスタンスが最初に実行されるときにクラスを初期化する必要があります)。創造された)。

class A:
    def __init__(self, a):  # use special method '__init__' for initializing
        self.a = a
    def __custom__(self):  # custom special method. you might almost do not use it
        pass
于 2019-01-17T17:57:08.510 に答える