Изменение имени в Python

Опубликовано: 2 Декабря, 2021

В процессе изменения имени любой идентификатор с двумя ведущими знаками подчеркивания и одним _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. А чтобы начать свое путешествие по машинному обучению, присоединяйтесь к курсу Машинное обучение - базовый уровень.