By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
432,483 Members | 1,052 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 432,483 IT Pros & Developers. It's quick & easy.

Finding the name of a class

P: n/a
Is there a function or method that returns the name of a class or class
instance?

class X(object):
pass

X.amethod() or X().amethod() should return the string "X".

X().__class__ returns "<class '__main__.X'>" which I could parse. Ugh.

Or I could use module pyclbr. Ugh**2.
Jul 18 '05 #1
Share this Question
Share on Google+
5 Replies


P: n/a
On Wed, 12 May 2004 20:10:07 -0400, Edward C. Jones wrote:
Is there a function or method that returns the name of a class or class
instance?

class X(object):
pass

X.amethod() or X().amethod() should return the string "X".

X().__class__ returns "<class '__main__.X'>" which I could parse. Ugh.

Or I could use module pyclbr. Ugh**2.

I havent found any better way to do it:

def classname(c):
sl = `c`.split(' ')[0][1:].split('.')
return len(sl) > 1 and sl[1] or sl[0]
Jul 18 '05 #2

P: n/a
"Edward C. Jones" wrote:
Is there a function or method that returns the name of a class or
class
instance?

class X(object):
pass

X.amethod() or X().amethod() should return the string "X".

X().__class__ returns "<class '__main__.X'>" which I could parse. Ugh.

Or I could use module pyclbr. Ugh**2.


Use the __name__ attribute:
class C: pass .... C.__name__ 'C' C().__class__.__name__

'C'

--
__ Erik Max Francis && ma*@alcyone.com && http://www.alcyone.com/max/
/ \ San Jose, CA, USA && 37 20 N 121 53 W && AIM erikmaxfrancis
\__/ Without love, benevolence becomes egotism.
-- Dr. Martin Luther King, Jr.
Jul 18 '05 #3

P: n/a
Edward C. Jones writes:
X().__class__ returns "<class '__main__.X'>" which I could
parse. Ugh.


How about X().__class__.__name__

--
Paul
Jul 18 '05 #4

P: n/a
Erik Max Francis wrote:
"Edward C. Jones" wrote:
Is there a function or method that returns the name of a class or
class
instance?
...


...
Use the __name__ attribute:

Thanks. Once I knew the answer, I had no trouble finding it in the
documentation. See Library Reference, 3.11.1 or Reference Manual 3.2. I
didn't find it because "__name__" is not listed in dir(X) or dir(X()).
Jul 18 '05 #5

P: n/a
I had exactly the same problem, and was given the __name__ solution by
members of this newsgroup. I then posted a bug report to Sourceforge,
and got a reply from Python's maintainer's: the inability of
dir(object) to display __name__ is not a bug, but a natural
consequence of the way dir()is implemented. The responses to my bug
report follow:

Thomas Philips
--------------------------------------------------------------------------------
Date: 2004-05-11 22:55
Sender: fdrake
Logged In: YES
user_id=3066

I'm not convinced that attributes dynamically provided by
__getattr__() aren't actual attributes; it would be best if dir()
reported them if they're available via getattr(ob, name). Whether or
not this is practical is another matter.

I've just closed documentation bug #952212, so at least the presence
of the __name__ attribute on types and classes is mentioned somewhere.

I'm re-classifying this bug report, since the dynamic behavior of
dir() is not a documentation issue.
--------------------------------------------------------------------------------

Date: 2004-05-02 15:47
Sender: montanaro
Logged In: YES
user_id=44345

After a message from the submitter, it's apparent he was referring to
class objects not showing '__name__' attributes in dir() output. This
is a case of an attribute not being visible to dir() because it's not
directly present in the object's __dict__ and is trapped at evaluation
time by __getattr__(). Short of hacking dir() or adding a special
attribute ("__attributes__"?) to objects which have __getattr__()
methods I don't see a way around this problem.

Wasn't there discussion of such an attribute which would expose such
dynamic attributes to dir()? I don't see anything in the
implementation of PyObject_Dir().

--------------------------------------------------------------------------------

Date: 2004-05-01 21:02
Sender: montanaro
Logged In: YES
user_id=44345

Are you sure that the object has an actual __name__ attribute (and not
something computed by a __getattr__ method)?
import sys
dir(sys) ['__displayhook__', '__doc__', '__excepthook__', '__name__',
'__stderr__', '__stdin__', '__stdout__', '_getframe', 'api_version',
'argv', 'builtin_module_names', 'byteorder', 'call_tracing',
'callstats', 'copyright', 'displayhook', 'exc_clear', 'exc_info',
'exc_type', 'excepthook', 'exec_prefix', 'executable', 'exit',
'exitfunc', 'getcheckinterval', 'getdefaultencoding',
'getdlopenflags', 'getfilesystemencoding', 'getrecursionlimit',
'getrefcount', 'hexversion', 'maxint', 'maxunicode', 'meta_path',
'modules', 'path', 'path_hooks', 'path_importer_cache', 'platform',
'prefix', 'ps1', 'ps2', 'setcheckinterval', 'setdlopenflags',
'setprofile', 'setrecursionlimit', 'settrace', 'stderr', 'stdin',
'stdout', 'version', 'version_info', 'warnoptions'] sys.__name__

'sys'
Jul 18 '05 #6

This discussion thread is closed

Replies have been disabled for this discussion.