Ну, есть почти способ сделать это:
#!/usr/bin/env python
import traceback
class SomeObject():
def __init__(self, def_name=None):
if def_name == None:
(filename,line_number,function_name,text)=traceback.extract_stack()[-2]
def_name = text[:text.find('=')].strip()
self.defined_name = def_name
ThisObject = SomeObject()
print ThisObject.defined_name
# ThisObject
Модуль трассировки позволяет вам заглянуть в код, используемый для вызова SomeObject (). С небольшими переборками строк text[:text.find('=')].strip()
вы можете догадаться, что должно быть def_name.
Однако этот хак хрупкий. Например, это не работает так хорошо:
ThisObject,ThatObject = SomeObject(),SomeObject()
print ThisObject.defined_name
# ThisObject,ThatObject
print ThatObject.defined_name
# ThisObject,ThatObject
Итак, если бы вы использовали этот хак, вы должны иметь в виду, что вы должны вызвать SomeObject (), используя простой оператор python:
ThisObject = SomeObject()
Кстати, в качестве еще одного примера использования traceback, если вы определяете
def pv(var):
# stack is a list of 4-tuples: (filename, line number, function name, text)
# see http://docs.python.org/library/traceback.html#module-traceback
#
(filename,line_number,function_name,text)=traceback.extract_stack()[-2]
# ('x_traceback.py', 18, 'f', 'print_var(y)')
print('%s: %s'%(text[text.find('(')+1:-1],var))
, вы можете вызвать
x=3.14
pv(x)
# x: 3.14
, чтобы напечатать оба имя переменной и ее значение.