Изменение имени в Python
В процессе изменения имени любой идентификатор с двумя ведущими знаками подчеркивания и одним _classname__identifier
где имя класса - это имя текущего класса. Это означает, что любой идентификатор формы __geek (не менее двух ведущих подчеркиваний или не более одного подчеркивания в конце) заменяется на _classname__geek, где имя класса - это имя текущего класса с удаленными ведущими подчеркиваниями.
Пример:
# Python program to demonstrate # name mangling class Student: def __init__( self , name): self .__name = name def displayName( self ): print ( self .__name) s1 = Student( "Santhosh" ) s1.displayName() # Raises an error print (s1.__name) |
Выход
Сантош
Отслеживание (последний вызов последний): Файл "/home/be691046ea08cd2db075d27186ea0493.py", строка 14, в печать (s1 .__ имя) AttributeError: объект "Студент" не имеет атрибута "__name"
В приведенном выше примере переменная класса __name
недоступна за пределами класса. Доступ к нему возможен только внутри класса. Любое изменение переменной класса может быть выполнено только внутри класса.
Процесс изменения имени
С помощью метода dir()
мы можем увидеть процесс изменения имени, который выполняется для переменной класса. Процесс изменения имени был выполнен переводчиком. Метод dir()
используется путем передачи объекта класса и возвращает все допустимые атрибуты, принадлежащие этому объекту.
Выход
[‘_Student__name’, ‘__class__’, ‘__delattr__’, ‘__dict__’, ‘__dir__’, ‘__doc__’, ‘__eq__’, ‘__format__’, ‘__ge__’, ‘__getattribute__’, ‘__gt__’, ‘__hash__’, ‘__init__’, ‘__le__’, ‘__lt__’, ‘__module__’, ‘__ne__’, ‘__new__’, ‘__reduce__’, ‘__reduce_ex__’, ‘__repr__’, ‘__setattr__’, ‘__sizeof__’, ‘__str__’, ‘__subclasshook__’, ‘__weakref__’]
Приведенный выше вывод показывает dir()
возвращающий все допустимые атрибуты с процессом изменения имени, который выполняется для переменной класса __name. Имя изменено с __name на _Student__name.
Доступ к переменным с измененным именем
Процесс изменения имени помогает получить доступ к переменным класса извне. Доступ к переменным класса можно получить, добавив к нему _classname. Изменение имени ближе всего к частному, а не к частному.
# Python program to demonstrate # name mangling class Student: def __init__( self , name): self .__name = name s1 = Student( "Santhosh" ) print (s1._Student__name) |
Выход
Сантош
Доступ к указанной выше переменной класса осуществляется путем добавления к ней _classname. Доступ к переменной класса осуществляется извне класса с именем _Student__name.
Изменение имени с переопределением метода
Из-за искажения имен существует ограниченная поддержка допустимого варианта использования для частных членов класса, в основном, чтобы избежать конфликтов имен имен с именами, определенными подклассами. Любой идентификатор формы __geek (не менее двух ведущих подчеркиваний или не более одного подчеркивания в конце) заменяется на _classname__geek, где имя класса - это имя текущего класса с удаленными ведущими подчеркиваниями. Пока это происходит в определении класса, это искажение выполняется. Это полезно для того, чтобы позволить подклассам переопределять методы без прерывания вызовов методов внутри класса.
Давайте посмотрим на этот пример и попробуем выяснить, как работает это подчеркивание:
Пример:
# Python code to illustrate how mangling works # With method overriding Map class : def __init__( self ): self .__geek() def geek( self ): print ( "In parent class" ) # private copy of original geek() method __geek = geek class MapSubclass( Map ): # provides new signature for geek() but # does not break __init__() def geek( self ): print ( "In Child class" ) # Driver's code obj = MapSubclass() obj.geek() |
Выход:
В родительском классе В детском классе
Внимание компьютерщик! Укрепите свои основы с помощью базового курса программирования Python и изучите основы.
Для начала подготовьтесь к собеседованию. Расширьте свои концепции структур данных с помощью курса Python DS. А чтобы начать свое путешествие по машинному обучению, присоединяйтесь к курсу Машинное обучение - базовый уровень.