Dlaczego niektóre funkcje mają podkreślniki "" przed i po nazwie funkcji?

To "podkreślanie" wydaje się występować często i zastanawiałem się, czy to jest wymóg w języku Python, czy tylko kwestia konwencji?

Czy mógłby ktoś wymienić i wyjaśnić, które funkcje mają podkreślniki i dlaczego (__init__, na przykład)?

Author: ZF007, 2011-12-31

6 answers

From the Python PEP 8 -- Style Guide for Python Code :

Opis: Nazewnictwo Stylów

Następujące specjalne formy wykorzystujące interlinię lub końcówkę podkreślenia to dostrzeżone braki uźródłowienia:]}

  • _single_leading_underscore: słaby wskaźnik "użytku wewnętrznego". Np. from M import * nie importuje obiektów, których nazwa zaczyna się od podkreślenia.

  • single_trailing_underscore_: używany przez Konwencję w celu uniknięcia konflikty ze słowem kluczowym Python, np.

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

  • __double_leading_underscore: podczas nazywania atrybutu klasy, wywołuje namaglowanie nazw (wewnątrz klasy FooBar, __boo staje się _FooBar__boo; patrz poniżej).

  • __double_leading_and_trailing_underscore__: "magiczne" obiekty lub atrybuty, które żyją w przestrzeniach nazw kontrolowanych przez użytkownika. Np. __init__, __import__ lub __file__. Nigdy nie wymyślaj takich nazw; używaj ich tylko zgodnie z dokumentacją.

Zauważ, że nazwy z podwójnym pierwszym i końcowym podkreśleniem są zasadniczo zarezerwowane dla samego Pythona: "nigdy nie wymyślaj takich nazw; używaj ich tylko zgodnie z dokumentacją".

 559
Author: Michael Burr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-26 18:45:29

Inni respondenci są poprawni w opisywaniu podwójnego podkreślenia wiodącego i końcowego jako konwencji nazewnictwa dla metod "specjalnych" lub "magicznych".

Podczas gdy można wywoływać te metody bezpośrednio (na przykład[10, 20].__len__()), obecność podkreślników jest wskazówką, że te metody są przeznaczone do wywołania pośrednio (na przykładlen([10, 20])). Większość operatorów Pythona ma skojarzoną metodę "magiczną" (na przykład a[x] jest zwykłym sposobem wywoływania a.__getitem__(x)).

 62
Author: Raymond Hettinger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-31 20:05:11

Nazwy otoczone podwójnymi podkreślnikami są "specjalne" dla Pythona. Są one wymienione w odniesienie do języka Python, sekcja 3, "Model danych" .

 22
Author: Ignacio Vazquez-Abrams,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-03 08:52:36

Właściwie używam nazw metod_, gdy muszę się różnić między nazwami klas rodzica i dziecka. Czytałem kilka kodów, które używały tego sposobu tworzenia klas rodzic-dziecko. Jako przykład mogę podać ten kod:

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))

...

I dziecko, które ma metodę _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)
    )

...

 5
Author: Omadbek Onorov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-30 16:43:54

Dodano przykład, aby zrozumieć użycie _ _ w Pythonie. Oto lista wszystkich __

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

Niektóre klasy identyfikatorów (oprócz słów kluczowych) mają specjalne znaczeń. Dowolne użycie * nazwy, w jakimkolwiek innym kontekście, które nie po wyraźnie udokumentowanym użyciu, podlega złamaniu bez warning

Ograniczenie dostępu za pomocą _ _

"""
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
 1
Author: Hitesh Sahu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-01-28 12:07:24

Ta konwencja jest używana dla specjalnych zmiennych lub metod (tzw. "metoda magiczna"), takich jak __init__ i __len__. Metody te zapewniają specjalne funkcje składniowe lub robią specjalne rzeczy.

Na przykład, __file__ wskazuje lokalizację pliku Pythona, {[4] } jest wykonywane podczas wykonywania wyrażenia a == b.

Użytkownik może oczywiście stworzyć niestandardową metodę specjalną, co jest bardzo rzadkim przypadkiem, ale często może zmodyfikować niektóre z wbudowanych metod specjalnych (np. powinieneś zainicjować klasę z __init__, które będą wykonywane na początku, gdy instancja klasy zostanie utworzona).

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
 1
Author: Shagun Pruthi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-04-19 22:44:00