Разница между "__method__" и "методом"
В чем разница между __method__
, method
и _method__
?
Есть ли какие-либо или по какой-то случайной причине люди думали, что __doc__
должен быть прав, а не doc
. Что делает метод более особенным, чем другой?
Ответы
Ответ 1
Из руководства по стилю:
-
_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
-
method
- это обычный метод
-
_method
не следует вызывать, если вы не знаете, что делаете, что обычно означает, что вы сами написали метод.
-
__method
2 символа подчеркивания используются для предотвращения перебора имен. Атрибуты или методы, подобные этому, доступны через instance._ClassName__method
. Хотя многие люди называют это "private", это не так. Вы никогда не должны использовать это, чтобы кто-то не обращался к этому методу, вместо этого используйте _method
.
-
__method__
используется для специальных методов, которые изменяют поведение экземпляра. Не называйте свои собственные методы следующим образом.
Ответ 3
Это все соглашения, поэтому они не применяются в любом случае. Тем не менее, вы обычно можете ожидать:
__somename__
Что-то определено в самой спецификации языка python. Не используйте это в своем собственном наименовании.
_somename
Обычно предполагается, что он вызывается через какой-то другой механизм, а не напрямую. Подобно объявлению чего-то частного на большинстве других языков, но никак не принудительно.
__somename
На самом деле это не должно быть вызвано напрямую, и оно искажено внутренне, чтобы остановить вас, делая это случайно. Если вам действительно нужно вызвать его по какой-либо причине, проверьте документацию, чтобы узнать, как это сделать.
Любое из вышеперечисленных может применяться в равной степени к именам функций, переменных или классов.
Ответ 4
Эти методы были названы таковыми, чтобы уменьшить вероятность именования столкновений.
Ответ 5
Способы, предваряемые и префиксы с двойным подчеркиванием, обычно помечены так, чтобы указывать, что они являются частью спецификации языка Python.
Ответ 6
Некоторые методы с префиксом и суффиксом двойного подчеркивания являются специальными. Например, __init__
вызывается всякий раз, когда создается экземпляр этого класса, и __str__
вызывается, когда объект должен быть напечатан. В принципе, их можно назвать особыми способами. Вы можете использовать их, как и любой другой метод, или вы можете вызвать их с помощью специального способа, связанного с ними.
Я не знаю о глобальных функциях с двойным подчеркиванием (не принадлежащих к какому-либо классу), но я думаю, что их нет.
Ответ 7
Образец __name__
указывает "магические" методы. Они называются различными функциями, такими как
str(x) -> x.__str__()
repr(x) -> x.__repr__()
x[0] -> x.__getitem__(0)
etc
Один префикс нижнего подчеркивания должен указывать частный атрибут и должен выполняться только через соглашение.
двойной префикс подчеркивания инициирует манипулирование именами, где атрибут с именем __attr заменяется на __Class_attr после создания экземпляра.
Шаблон, который вы используете _method__, на самом деле не используется ни для чего.