问题
I know that methods __repr__
and __str__
exist to give a formal and informal representation of class instances. But does an equivalent exist for class objects too, so that when the class object is printed, a nice representation of it could be shown?
>>> class Foo:
... def __str__(self):
... return "instance of class Foo"
...
>>> foo = Foo()
>>> print foo
instance of class Foo
>>> print Foo
__main__.Foo
回答1:
When you call print(foo)
, foo
's __str__
method is called. __str__
is found in the class of foo
, which is Foo
.
Similarly, when you call print(Foo)
, Foo
's __str__
method is called. __str__
is found in the class of Foo
, which is normally type
. You can change that using a metaclass:
class FooType(type):
def __str__(cls):
return 'Me a Foo'
def __repr__(cls):
return '<Foo>'
class Foo(object):
__metaclass__=FooType
def __str__(self):
return "instance of class Foo"
print(Foo)
# Me a Foo
print(repr(Foo))
# <Foo>
回答2:
You might be able to do this with a metaclass, but AFAIK, there's no general solution for normal classes.
If it's just your own classes, you could adopt a coding standard of including a particular class variable with your metadata, ie:
class Whatever(object):
classAuthor = "me"
classCreated = "now"
Or if you're using a python that supports class decorators, you could use a decorator to annotate it for you automatically or enforce that the metadata is there.
But... maybe you just want AClass.__name__
?
回答3:
In my view, it's a good thing that you can't make a custom repr
string for classes; the point of a class is to create instances of that class.
回答4:
You cannot use the __repr__
or __str__
on the class type but you can use the docstring to present information about the class
>>> class Foo:
... """Foo's description"""
... def __str__(self):
... return "instance of class Foo"
...
>>> foo = Foo()
>>> print foo
instance of class Foo
>>> print Foo.__doc__
Foo's description
>>> Foo.__doc__
"Foo's description"
来源:https://stackoverflow.com/questions/5086113/methods-for-python-classes-representation