I have written a code in Python3 using the IDE Wing, but I want to change a variable name, e.g., var_1
, to var_2
in all places in my file. In MATLAB, when you change a variable name in one place, by Shift
+Enter
it is automatically done for all other occurrences of that variable in the file. Is there any similar way to do it in Python?
asked Jul 7, 2017 at 16:59
CLAUDECLAUDE
2741 gold badge2 silver badges10 bronze badges
1
You can accomplish this using nearly any text editor you want by using the Find and Replace feature.
The normal keyboard shortcut (including python’s IDLE) for this is Ctrl+H
, though different editors have different shortcuts.
answered Jul 7, 2017 at 17:00
Jacobm001Jacobm001
4,3504 gold badges32 silver badges50 bronze badges
In WingIDE you have the option via the Refactor Menu to do Rename Symbol.
This does an intelligent replace, and also takes care of distinguishing global variable from class attributes with the same name.
answered Jul 7, 2017 at 17:08
AnthonAnthon
65.7k29 gold badges179 silver badges236 bronze badges
If you’re using the Python Idle(GUI) you can Ctrl + H and select Replace All.
answered Jul 7, 2017 at 17:01
LuisLuis
2741 gold badge5 silver badges17 bronze badges
Visual Studio Code is Ctrl + Shift + L and begin typing.
Sublime/Atom are alt + F3.
answered Jul 7, 2017 at 17:03
PseuplexPseuplex
2952 silver badges12 bronze badges
If you’re using the PyCharm IDE use Mayus + F6 on the variable that you want change and write the new name variable.
answered Jul 7, 2017 at 17:02
VIXVIX
5973 silver badges15 bronze badges
I have written a code in Python3 using the IDE Wing, but I want to change a variable name, e.g., var_1
, to var_2
in all places in my file. In MATLAB, when you change a variable name in one place, by Shift
+Enter
it is automatically done for all other occurrences of that variable in the file. Is there any similar way to do it in Python?
asked Jul 7, 2017 at 16:59
CLAUDECLAUDE
2741 gold badge2 silver badges10 bronze badges
1
You can accomplish this using nearly any text editor you want by using the Find and Replace feature.
The normal keyboard shortcut (including python’s IDLE) for this is Ctrl+H
, though different editors have different shortcuts.
answered Jul 7, 2017 at 17:00
Jacobm001Jacobm001
4,3504 gold badges32 silver badges50 bronze badges
In WingIDE you have the option via the Refactor Menu to do Rename Symbol.
This does an intelligent replace, and also takes care of distinguishing global variable from class attributes with the same name.
answered Jul 7, 2017 at 17:08
AnthonAnthon
65.7k29 gold badges179 silver badges236 bronze badges
If you’re using the Python Idle(GUI) you can Ctrl + H and select Replace All.
answered Jul 7, 2017 at 17:01
LuisLuis
2741 gold badge5 silver badges17 bronze badges
Visual Studio Code is Ctrl + Shift + L and begin typing.
Sublime/Atom are alt + F3.
answered Jul 7, 2017 at 17:03
PseuplexPseuplex
2952 silver badges12 bronze badges
If you’re using the PyCharm IDE use Mayus + F6 on the variable that you want change and write the new name variable.
answered Jul 7, 2017 at 17:02
VIXVIX
5973 silver badges15 bronze badges
В этом руководстве мы собираемся обсудить процесс name mangling в Python и то, как мы можем использовать различные методы в процессе изменения имени в Python.
Изменение имени
Процесс, в котором любой заданный идентификатор с одним конечным подчеркиванием и двумя ведущими подчеркиваниями текстуально заменяется на __ClassName__Identifier, известен как Name mangling (изменение имени). В __ClassName__Identifier name ClassName – это имя текущего класса, в котором присутствует идентификатор.
Иллюстрация
По сути, приведенное выше определение искажения имени означает, что любой идентификатор в такой форме, как __Jtp (либо по крайней мере два ведущих подчеркивания, либо не более одного подчеркивания в конце имени) будет заменен на __ClassName__Jtp (имя текущего класса заменит ClassName) с начальным подчеркиванием в полоску в ClassName.
Посмотрите на следующий пример, чтобы понять процесс изменения имени.
Пример:
# A testing class for identifier class Testing: # Giving Name as an identifier def __init__(self, name): # Identifier initializing self.__name = name def PrintName(self): print(self.__name) t1 = Testing("JavaTpoint") # Calling variable name with the class t1.PrintName() # Printing name in the output
Выход:
JavaTpoint
Объяснение:
Мы определили тестовый класс с идентификатором имени в классе в приведенной выше программе. Внутри класса тестирования мы определили две функции по умолчанию и одну с PrintName().
В функции PrintName() мы задали команду печати для печати имени. Затем мы инициализировали переменную t1 с помощью класса тестирования. Наконец, мы использовали PrintName() для печати имени, которое мы использовали в классе Testing при его инициализации.
Примечание. Если мы попытаемся получить доступ к функциям и переменным класса Testing вне класса, это вызовет ошибку. Любые изменения, внесенные в переменную, указанную внутри класса тестирования, могут быть выполнены только внутри класса.
Пример 2:
# A testing class for identifier class Testing: # Giving Name as an identifier def __init__(self, name): # Identifier initializing with double underscore self.__name = name def PrintName(self): print(self.__name) t1 = Testing("JavaTpoint") # Calling variable name with the class t1.PrintName() # Printing name in the output # Accessing identifier outside the class print(t1.__name) # will throw an error in the output
Выход:
JavaTpoint Traceback(most recent call last): File "C:UsersManishDownloadscode.py", line 12, in print(t1.__name) # will throw an error in the output AttributeError: 'Testing' object has no attribute '__name'
Реализация процесса изменения имен в Python такая же, как мы обсуждали выше. Мы будем использовать различные методы в нашей программе Python для реализации процесса изменения имен и доступа к переменным в нем.
В этом разделе мы выполним следующие задачи:
- Изменение имени в Python с помощью метода dir().
- Доступ к измененным именам переменных в программе.
- Изменение имени с переопределением метода в Python.
Мы будем использовать программу для каждого метода, чтобы понять его реализацию на Python.
1. Изменение имени с помощью метода dir()
Мы можем использовать метод dir() для выполнения процесса изменения имени, и это будет сделано для класса, указанного в коде. Интерпретатор Python будет изменять имя класса. Мы можем использовать метод dir(), передав в нем определенный объект класса, и метод dir() вернет все допустимые атрибуты, принадлежащие данному объекту класса.
Посмотрите на следующий пример программы, чтобы понять этот метод изменения имени dir().
Пример:
# A testing class for name mangling class Testing: def __init__(self, name): self.__name = name # Initializing variable with the testing class t1 = Testing("JavaTpoint") # Using dir() method on initialized variable print(dir(t1))
Выход:
['_Testing__name', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
Объяснение:
Когда мы смотрим на вывод, мы видим, что метод dir(), который мы использовали для инициализированной переменной, то есть t1, вернул все допустимые атрибуты тестирования класса и напечатал их. Мы также можем видеть, что имя идентификатора, то есть __name, изменено интерпретатором на _Testing__name.
2. Доступ к измененным именам переменных
Мы можем получить доступ к измененным именам переменных даже за пределами класса и напечатать входящие выходные данные (в отличие от доступа к переменной класса, которая вернет ошибку). Чтобы получить доступ к измененным именам переменных вне класса, нам просто нужно добавить _ClassName с переменной, и мы также можем вывести значение на выходе.
Посмотрите на следующую программу, в которой мы получили доступ к измененным именам переменных вне тестового класса.
Пример:
# A testing class for name mangling class Testing: def __init__(self, name): self.__name = name # Initializing variable with the testing class t1 = Testing("JavaTpoint") # Accessing Name mangled variables outside testing class print("The name mangled that we are accessing outside the class: ", t1._Testing__name)
Выход:
The name mangled that we are accessing outside the class: JavaTpoint
Объяснение:
Мы смогли получить доступ к переменной __name снаружи, так как это была переменная с измененным именем, и она возвращала значение имени в выводе.
3. Изменение имени с помощью переопределения метода
Поскольку мы используем процесс изменения имени в нашей программе, мы ограничены из-за небольшой поддержки допустимого варианта использования членов из частного класса. Ограниченная поддержка допустимого варианта использования частного члена класса состоит в том, чтобы избежать конфликтов имен различных имен с именами, определенными внутри подклассов.
Пока процесс изменения имени будет происходить в соответствии с определением класса Python, он будет выполняться интерпретатором. И для подклассов в программе очень полезно позволить им переопределять методы, даже не прерывая вызовы межклассового метода.
Давайте разберемся в следующем примере.
# A default testing class for name mangling class Testing: def __init__(self): self.__jtp() # name mangling with the Jtp variable def jtp(self): # default function for name mangling in parent class print("Name mangling process done inside the parent testing class") # copy of jtp() method for private class members __jtp = jtp # Name mangling with method overriding process # A subclass for Testing class class SubTesting(Testing): # Providing new signature for jtp() function def jtp(self): print("Name mangling process done inside the child sub-testing class") # Calling the objects from subclass and function of it obj = SubTesting() obj.jtp()
Выход:
Name mangling process done inside the parent testing class Name mangling process done inside the child sub-testing class
Заключение
Во-первых, мы узнали о введении процесса изменения имени в этом руководстве. Мы также узнали, как можно использовать метод dir() для изменения имен в Python. Затем мы получили доступ к измененным именам переменных вне класса, в котором они присутствуют. Наконец, мы также узнали о том, как использовать процесс изменения имени с переопределением метода в данных подклассах в программе.
Изучаю Python вместе с вами, читаю, собираю и записываю информацию опытных программистов.
Сообщение от Matan!
Эта технология была раньше в Python?
Это не технология, а особенность реализации.
В Python все есть объект. У объекта есть свойство __dict__, которое содержит динамические атрибуты в виде словаря.
(Можно и не обращаться напрямую к __dict__, так как есть соответствующие глобальные функции setattrgetattr)
Модуль в Python это тоже объект. И он тоже имеет свой внутренний __dict__ с инициализированными переменными, и прочими именами верхнего уровня (классыфункции).
И в этот словарь можно также записывать новые пары keyvalue, создавая тем самым новые переменные.
Python | ||
|
Сообщение от Matan!
В каких случаях она применялась?
Для программистов подобная динамика нужна не для того, чтобы втихую плодить кучу неявных переменных, а для более осмысленных вещей: например, для динамической привязки методов своему классу. Когда в класс нужноможно в рантайме добавить совершенно новый метод, который ранее не был определен для него.
Также все это абсолютно логично используется для всяких волшебств метапрограммирования
Я в нем не знаток, но если заглянуть в дебри фреймворков типа Django, то там оно (метапрограммирование) используется особо рьяно.
Добавлено через 17 минут
Забыл добавить, что динамически в Python можно вообще много чего создать.
Например, класс.
Пример с хабра:
Python | ||
|
А стандартный синтаксис создания класса не более чем сахар поверх этого.
В процессе изменения имени любой идентификатор с двумя ведущими знаками подчеркивания и одним _classname__identifier
где имя класса — это имя текущего класса. Это означает, что любой идентификатор формы __geek (не менее двух ведущих подчеркиваний или не более одного подчеркивания в конце) заменяется на _classname__geek, где имя класса — это имя текущего класса с удаленными ведущими подчеркиваниями.
Пример:
class
Student:
def
__init__(
self
, name):
self
.__name
=
name
def
displayName(
self
):
print
(
self
.__name)
s1
=
Student(
"Santhosh"
)
s1.displayName()
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. Изменение имени ближе всего к частному, а не к частному.
class
Student:
def
__init__(
self
, name):
self
.__name
=
name
s1
=
Student(
"Santhosh"
)
print
(s1._Student__name)
Выход
Сантош
Доступ к указанной выше переменной класса осуществляется путем добавления к ней _classname. Доступ к переменной класса осуществляется извне класса с именем _Student__name.
Изменение имени с переопределением метода
Из-за искажения имен существует ограниченная поддержка допустимого варианта использования для частных членов класса, в основном, чтобы избежать конфликтов имен имен с именами, определенными подклассами. Любой идентификатор формы __geek (не менее двух ведущих подчеркиваний или не более одного подчеркивания в конце) заменяется на _classname__geek, где имя класса — это имя текущего класса с удаленными ведущими подчеркиваниями. Пока это происходит в определении класса, это искажение выполняется. Это полезно для того, чтобы позволить подклассам переопределять методы без прерывания вызовов методов внутри класса.
Давайте посмотрим на этот пример и попробуем выяснить, как работает это подчеркивание:
Пример:
Map
class
:
def
__init__(
self
):
self
.__geek()
def
geek(
self
):
print
(
"In parent class"
)
__geek
=
geek
class
MapSubclass(
Map
):
def
geek(
self
):
print
(
"In Child class"
)
obj
=
MapSubclass()
obj.geek()
Выход:
В родительском классе В детском классе
Внимание компьютерщик! Укрепите свои основы с помощью базового курса программирования Python и изучите основы.
Для начала подготовьтесь к собеседованию. Расширьте свои концепции структур данных с помощью курса Python DS. А чтобы начать свое путешествие по машинному обучению, присоединяйтесь к курсу Машинное обучение — базовый уровень.