Getting an instance name inside class __init__() [duplicate] Getting an instance name inside class __init__() [duplicate] python python

Getting an instance name inside class __init__() [duplicate]


Well, there is almost a way to do it:

#!/usr/bin/env pythonimport tracebackclass 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_nameThisObject = SomeObject()print ThisObject.defined_name # ThisObject

The traceback module allows you to peek at the code used to call SomeObject().With a little string wrangling, text[:text.find('=')].strip() you can guess what the def_name should be.

However, this hack is brittle. For example, this doesn't work so well:

ThisObject,ThatObject = SomeObject(),SomeObject()print ThisObject.defined_name# ThisObject,ThatObjectprint ThatObject.defined_name # ThisObject,ThatObject

So if you were to use this hack, you have to bear in mind that you must call SomeObject()using simple python statement:

ThisObject = SomeObject()

By the way, as a further example of using traceback, if you define

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))

then you can call

x=3.14pv(x)# x: 3.14

to print both the variable name and its value.


Instances don't have names. By the time the global name ThisObject gets bound to the instance created by evaluating the SomeObject constructor, the constructor has finished running.

If you want an object to have a name, just pass the name along in the constructor.

def __init__(self, name):    self.name = name


You can create a method inside your class that check all variables in the current frame and use hash() to look for the self variable.

The solution proposed here will return all the variables pointing to the instance object.

In the class below, isinstance() is used to avoid problems when applying hash(), since some objects like a numpy.array or a list, for example, are unhashable.

import inspectclass A(object):    def get_my_name(self):        ans = []        frame = inspect.currentframe().f_back        tmp = dict(frame.f_globals.items() + frame.f_locals.items())        for k, var in tmp.items():            if isinstance(var, self.__class__):                if hash(self) == hash(var):                    ans.append(k)        return ans

The following test has been done:

def test():    a = A()    b = a    c = b    print c.get_my_name()

The result is:

test()#['a', 'c', 'b']