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