Автор оригинала: Chris.
Одиночный подчеркивает в Python "_"
используется для того, чтобы сделать переменную, отличную от ключевого слова Python, например, в float_ = 8
или указать, что он должен использоваться в частном контексте, таком как в _var = 8
Отказ
>>> _str = 'hello' >>> _str 'hello'
Двойной подчеркивает в Python "__"
(называется “ "__init__"
, это указывает на то, что это специальный метод в Pythonic называется «Магический метод» Отказ
>>> class Wizard: def __init__(self): self.mana = 100 >>> harry = Wizard() >>> harry.mana 100
В этой статье и бонусному видео вы узнаете INS и выходы подчеркивания в Python.
Определения классов могут быть пугающими. Иногда, если вы прочитаете упрощенные примеры кода из учебных пособий Python, вы можете поверить, что вы получите учебное пособие. Но написание и чтение кода в реальном мире могут стать уродливым очень быстро. Например, посмотрите на следующий фрагмент кода от Online Python Учебник :
class Length: __metric = {"mm" : 0.001, "cm" : 0.01, "m" : 1, "km" : 1000, "in" : 0.0254, "ft" : 0.3048, "yd" : 0.9144, "mi" : 1609.344 } def __init__(self, value, unit = "m" ): self.value = value self.unit = unit def Converse2Metres(self): return self.value * Length.__metric[self.unit] def __add__(self, other): l = self.Converse2Metres() + other.Converse2Metres() return Length(l / Length.__metric[self.unit], self.unit ) def __str__(self): return str(self.Converse2Metres()) def __repr__(self): return "Length(" + str(self.value) + ", '" + self.unit + "')" if __name__ == "__main__": x = Length(4) print(x) y = eval(repr(x)) z = Length(4.5, "yd") + Length(1) print(repr(z)) print(z)
Если вы уже не вложили время, усилия и деньги в опытное образование Python, вы можете спросить: Что не так с этим кодом?
После успокоения вы можете понять, что главное, что вы не получаете, это использование «подчеркивания» в Python. В фрагменте кода подчеркивает, кажется, повсюду!
Грустная вещь, если вы не получите смысл подчеркивания, вы никогда не сможете следовать глубоким дискуссиям Python, вы не поймете много разговоров Python, не говоря уже о них других людей.
Это жизненно важно для вашей карьеры – и для вашей способности общаться в Python – что вы изучаете эти, казалось бы, тщательно мелкие знания.
В чем смысл подчеркивания в ориентации объекта Python?
Одиночный подчеркивает, на самом деле нет особого значения.
- Вы можете использовать подчеркивание на Отдельные слова такие как в:
this_is_a_long_variable
Отказ - Если вы начнете Имя атрибута экземпляра с подчеркиванием, такими как
_var.
, вы указываете, что этот атрибут экземпляра должен быть «частным», и он не должен быть доступен из-за пределов класса. Однако все еще возможно, что вы можете видеть в следующем фрагменте кода:
class Wizard: # underscore = visual separator studied_at = "Hogwarts" # underscore = "please keep me private" _wizards = [] # discouraged but possible: print(Wizard._wizards) # [] print(Wizard.studied_at) # Hogwarts
Двойной подчеркивает (также называемый «Dunder» Python Pro Prov) с другой стороны, имеет особый смысл.
Есть два случая:
- Ведущие динадеры:
__var.
- Ограждающие Dunders:
__в этом__
Ведущие динданеры
При запуске имени с
Вот пример из Гарри Поттера, который показывает частную природу ведущего раздела:
class Wizard: # underscore = visual separator studied_at = "Hogwarts" # underscore = "please keep me private" _wizards = [] # enclosing dunder = magic methods def __init__(self, mana): self.mana = mana Wizard._wizards.append(self) # trailing underscore = overwrite keyword self.key_ = True # leading dunder = "enforce to keep me private" self.__supersecretphrase = "wingardium leviosa" def secret_trick(self): return self.__supersecretphrase tom = Wizard(100) print(tom.__supersecretphrase) # AttributeError: 'Wizard' object has no attribute '__supersecretphrase' print(tom.secret_trick()) # wingardium leviosa
Вы не можете получить доступ к атрибуту экземпляра __supersecrectprase
снаружи класса! Переводчик Python бросит ошибку, если вы попытаетесь сделать это таким тупым способом. Но вы можете сделать это, позвонив нечадному методу Secret_trick ()
который обращается к атрибуту частного экземпляра __supersecrectprase
из определения класса.
Теперь вы можете спросить:
В чем причина защиты имен таким образом?
Объектно-ориентированная парадигма программирования связана с идеей «инкапсуляции». Каждый объект инкапсулирует данные (атрибуты экземпляра) и способы доступа к данным (методы экземпляра). Наиболее экстремальным представлением является полное изменение атрибутов экземпляра извне. Это приводит к очень четкому семантике (что такое эффект ваших объектов) и скрывает сложность от пользователя вашего класса.
Охватывает декурс
При включении имени метода с __init__
Вы указываете, что это специальный метод. Pro’s называет это на самом деле «магический метод» в Python – термин, который очень подходит для нашего примера;).
Возможно, вы уже использовали специальные __init_
_ Метод (конструктор) довольно сильно для создания новых экземпляров из описания класса.
Но есть также много более специальных методов. Пример – это __str__
Метод, который позволяет создать новое текстовое представление вашего объекта.
Вот пример, который показывает, как класс Wizard2
Перезаписывает представление строки по умолчанию с помощью включения метода DUNDER __str__
:
class Wizard1: def __init__(self, mana): self.mana = mana class Wizard2(Wizard1): def __str__(self): return "Wizard's Mana Level: " + str(self.mana) tom = Wizard1(99) print(tom) # <__main__.Wizard1 object at 0x000001FEFF2ACA90> harry = Wizard2(101) print(harry) # Wizard's Mana Level: 101 The class Wizard1 is the top-level class here. It defines the constructor using the magic method __init__.
Класс Волшебник1.
Это класс верхнего уровня здесь. Определяет конструктор, использующий Magic Method __init__
Отказ
Класс Волшебник2.
это класс, который наследует от класса верхнего уровня (вы можете узнать о наследство здесь ). Другими словами, Wizard2
«Наследовать» все методы и атрибуты из родительского класса Wizard1
Отказ
Но сверх этого, Wizard2
также определяет __str__
Способ, который возвращает текстовое представление текущего экземпляра, на котором он называется.
Когда Печать Волшебник1.
Экземпляр (например, Tom
), текстовое представление по умолчанию действительно безобразно. Это только дает вам шестнадцатеричный Код объекта – не очень полезно понимать экземпляр. Но при печати Wizard2
Экземпляр (например, Гарри
), Python подразумевает ваш определенный __str__
Метод и возвращает текстовое представление, как определено вами.
Есть много других магических методов. Например, вы можете перезаписать поведение по умолчанию для добавления, вычитания, умножения и разделения:
class Wizard: def __init__(self, mana): self.mana = mana def __add__(self, other): return Wizard(self.mana + other.mana) tom = Wizard(99) harry = Wizard(101) print((tom+harry).mana) # 200
В примере добавление двух волшебников создает новый мастер, который имеет добавку Мана
обоих волшебников.
Куда пойти отсюда?
Ваше понимание оснований определяет ваш успех в любом поле, включая Python. Конечно, вы можете усердно учиться, чтобы учиться каждый бит о Python – но это может быть очень неэффективным. На мой взгляд, намного лучше поставить вашу учебную систему в руках профессионального учителя, который дает вам небольшие ежедневные дозы знаний Python. Таким образом, вы можете сделать небольшой ежедневный прогресс, чтобы стать мастером кода со временем.
Вот почему я создал свои 100% бесплатных серий электронной почты Python. Присоединяйтесь к десяткам тысяч читателей. Это весело! ( … и совершенно бесплатно)
Работая в качестве исследователя в распределенных системах, доктор Кристиан Майер нашел свою любовь к учению студентов компьютерных наук.
Чтобы помочь студентам достичь более высоких уровней успеха Python, он основал сайт программирования образования Finxter.com Отказ Он автор популярной книги программирования Python одноклассники (Nostarch 2020), Coauthor of Кофе-брейк Python Серия самооставленных книг, энтузиаста компьютерных наук, Фрилансера и владелец одного из лучших 10 крупнейших Питон блоги по всему миру.
Его страсти пишут, чтение и кодирование. Но его величайшая страсть состоит в том, чтобы служить стремлению кодер через Finxter и помогать им повысить свои навыки. Вы можете присоединиться к его бесплатной академии электронной почты здесь.
Оригинал: “https://blog.finxter.com/underscore-in-python/”