Ответ Роба (получивший наибольшее количество голосов выше) правильный. Я хотел бы добавить, что в некоторых ситуациях использование идентификаторов полезно, так как позволяет сравнивать объекты и определять, какие объекты относятся к вашим объектам.
Последний обычно помогает, например, отлаживать странные ошибки, когда изменяемые объекты передаются в качестве параметра, чтобы сказать классы, и назначаются локальным переменным в классе. Изменение этих объектов приведет к изменению переменных в классе. Это проявляется в странном поведении, когда одновременно меняются несколько вещей.
Недавно у меня была эта проблема с приложением Python / Tkinter, где редактирование текста в одном поле ввода текста меняло текст в другом, когда я печатал :)
Вот пример того, как вы можете использовать функцию id (), чтобы отслеживать, где находятся эти ссылки. Конечно, это не решение, охватывающее все возможные случаи, но идею вы поняли. И снова идентификаторы используются в фоновом режиме, и пользователь их не видит:
class democlass:
classvar = 24
def __init__(self, var):
self.instancevar1 = var
self.instancevar2 = 42
def whoreferencesmylocalvars(self, fromwhere):
return {__l__: {__g__
for __g__ in fromwhere
if not callable(__g__) and id(eval(__g__)) == id(getattr(self,__l__))
}
for __l__ in dir(self)
if not callable(getattr(self, __l__)) and __l__[-1] != '_'
}
def whoreferencesthisclassinstance(self, fromwhere):
return {__g__
for __g__ in fromwhere
if not callable(__g__) and id(eval(__g__)) == id(self)
}
a = [1,2,3,4]
b = a
c = b
democlassinstance = democlass(a)
d = democlassinstance
e = d
f = democlassinstance.classvar
g = democlassinstance.instancevar2
print( 'My class instance is of', type(democlassinstance), 'type.')
print( 'My instance vars are referenced by:', democlassinstance.whoreferencesmylocalvars(globals()) )
print( 'My class instance is referenced by:', democlassinstance.whoreferencesthisclassinstance(globals()) )
ВЫВОД:
My class instance is of <class '__main__.democlass'> type.
My instance vars are referenced by: {'instancevar2': {'g'}, 'classvar': {'f'}, 'instancevar1': {'a', 'c', 'b'}}
My class instance is referenced by: {'e', 'd', 'democlassinstance'}
Подчеркивание в именах переменных используется для предотвращения конфликтов имен. Функции используют аргумент «откуда», чтобы вы могли сообщить им, где начать поиск ссылок. Этот аргумент заполняется функцией, которая перечисляет все имена в данном пространстве имен. Globals () - одна из таких функций.