Рубрики
Без рубрики

Подчеркивание в Python [“_” vs “__”]

Подчеркивание “_” и “__” в Python (двойной и один подчеркивание) – Просто объяснил (+ бонусное видео)

Автор оригинала: Chris.

Одиночный подчеркивает в Python "_" используется для того, чтобы сделать переменную, отличную от ключевого слова Python, например, в float_ = 8 или указать, что он должен использоваться в частном контексте, таком как в _var = 8 Отказ

>>> _str = 'hello'
>>> _str
'hello'

Двойной подчеркивает в Python "__" (называется dunder ) используется для того, чтобы сделать атрибут экземпляра или метод частным, который не может быть доступен из-за пределов класса) при использовании в качестве ведущего префикса Dunder. При использовании в качестве ограждения такого как "__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) с другой стороны, имеет особый смысл.

Есть два случая:

  1. Ведущие динадеры: __var.
  2. Ограждающие Dunders: __в этом__

Ведущие динданеры

При запуске имени с Dunders , вы просите переводчика Python защищать его использовать снаружи класса. Так защищенный метод или атрибут не может быть доступно непосредственно снаружи (все еще возможно, но вам нужно активно обойти защиту).

Вот пример из Гарри Поттера, который показывает частную природу ведущего раздела:

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 из определения класса.

Теперь вы можете спросить:

В чем причина защиты имен таким образом?

Объектно-ориентированная парадигма программирования связана с идеей «инкапсуляции». Каждый объект инкапсулирует данные (атрибуты экземпляра) и способы доступа к данным (методы экземпляра). Наиболее экстремальным представлением является полное изменение атрибутов экземпляра извне. Это приводит к очень четкому семантике (что такое эффект ваших объектов) и скрывает сложность от пользователя вашего класса.

Охватывает декурс

При включении имени метода с Dunders такие как __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/”