introspection inquiry
Robin Becker
robin at SPAMREMOVEjessikat.fsnet.co.uk
Sun Feb 20 12:46:25 EST 2005
Michael Hoffman wrote:
> Robin Becker wrote:
>
>> self.__class__.__name__
>
>
> Unless I misunderstood the question, that won't work. That will
> give you the name of the class the object is an instance is of.
> I think he wants the name of the class the method was defined in.
>
> Here's a way to do that using metaclasses and Python's magic
> double-underscore attribute-mangling feature:
>
> """
> class SelfKnowledge(type):
> def __init__(cls, name, bases, dict):
> setattr(cls, "_%s__%s" % (name, "class_name"), name)
> type.__init__(cls, name, bases, dict)
>
> class Nietzsche(object):
> __metaclass__ = SelfKnowledge
>
> def __init__(self, text):
> self.spam = text
> print "In the constructor of the %s class" % self.__class_name
>
> class Kierkegaard(Nietzsche):
> def __init__(self, text):
> print "Now in the constructor of %s" % self.__class_name
> Nietzsche.__init__(self, text)
>
> Nietzsche("Thus Spake Zarathustra")
> print
>
> Kierkegaard("Fear and Trembling")
> """
>
> $ python test1.py
> In the constructor of the Nietzsche class
>
> Now in the constructor of Kierkegaard
> In the constructor of the Nietzsche class
I guess if you're right something along the lines of
import inspect
class A:
_class_name=inspect.currentframe().f_code.co_name
def __init__(self,text,_defining_class_name=_class_name):
print 'text=',text,'_defining_class_name=',_defining_class_name
class B(A):
pass
b=B('aaa')
==>text= aaa _defining_class_name= A
could work as well, but if we only need the local name why not just
insert directly.
--
Robin Becker
More information about the Python-list
mailing list