Вы можете использовать sys._getframe , чтобы получить номер строки, где вызывается B()
, затем вы можете использовать inspect.getsourcelines , чтобы получить фактическую строку кода. Оттуда вы можете разобрать строку кода, чтобы получить объект, которому присваивается B()
:
import sys
import inspect
class A(object):
def __init__(self):
self.vanilla_b = B()
self.chocolate_b = B()
class B(object):
def __init__(self):
line_num = sys._getframe().f_back.f_lineno
lines = inspect.getsourcelines( sys.modules[__name__] )[0]
line = lines[line_num - 1]
attr = line.split("=")[0].split(".")[1].strip()
print "B() is being assigned to", attr
A()
Если вы поместите приведенный выше код в скрипт Python и запустите его, он напечатает
B() is being assigned to vanilla_b
B() is being assigned to chocolate_b
Однако, это не будет работать в командной строке Python, так как __main__
является встроенным модулем, и, таким образом, модуль inspect не может извлечь свои строки исходного текста. Так что вы можете захотеть обернуть это в блок try / catch или что-то еще на случай, если ваш код когда-либо будет вызван из любого встроенного модуля.
Кстати, это, вероятно, плохая идея, но вы говорите, что знаете, что это нехорошая практика, и вы делаете это только для отладки, так что, надеюсь, вы сможете использовать этот вид хитрости мудро.