我如何提供python类(非实例)的非正式字符串表示

时间:2011-08-18 15:50:25

标签: python

我理解如何提供对象的实例的非正式表示,但我有兴趣提供类名的非正式字符串表示。

具体来说,我想覆盖打印Class时返回的内容(__main __。SomeClass)。

>>> class SomeClass:
...   def __str__(self):
...     return 'I am a SomeClass instance.'
... 
>>> SomeClass
<class __main__.SomeClass at 0x2ba2f0fd3b30>
>>> print SomeClass
__main__.SomeClass
>>> 
>>> x = SomeClass()
>>> x
<__main__.SomeClass instance at 0x2ba2f0ff3f38>
>>> print x
I am a SomeClass instance.

5 个答案:

答案 0 :(得分:8)

您的问题称为元类混淆。在A类中,如果A.__str__(self)是A实例方法的模板,我如何为A本身提供方法__str__()?救援的元课程。

以下链接比我在此更好地解释了这一点。

http://gnosis.cx/publish/programming/metaclass_1.html

http://gnosis.cx/publish/programming/metaclass_2.html

这里有一个简短的例子:

class AMeta(type):
    def __str__(self):
        return "I am the truly remarkable class A"

class A(object):
    __metaclass__ = AMeta
    def __str__(self):
        return "I am an A instance"

print A
I am the truly remarkable class A
print A()
I am an A instance

顺便说一句,你可以为__repr__做同样的事。

答案 1 :(得分:3)

您必须覆盖元类__str__方法。我真的不知道你为什么要这样做,但无论如何它都在这里。

>>> class InformalType(type):
...     def __str__(self):
...             return self.__name__
... 
>>> class MyFoo(object):
...     __metaclass__ = InformalType
...     pass
... 
>>> MyFoo
<class '__main__.MyFoo'>
>>> print MyFoo
MyFoo
>>> foo = MyFoo()
>>> foo
<__main__.MyFoo object at 0x7fdf9581f910>
>>> print foo
<__main__.MyFoo object at 0x7fdf9581f910>
>>> 

答案 2 :(得分:2)

要更改类的字符串表示形式:

class MC(type):
    def __repr__(cls):
        return 'I am Test'

class Test:
    __metaclass__ = MC
   pass

print Test

工作正常。

如果在定义repr(Test)时调用__str__,则不会使用您的custimized消息。

但是,如果您像我一样定义__repr__,并且str(Test)被调用,那么使用您的custimized消息,因为__repr__是后备而且__str__中未定义type

如果您只想更改名称:

def renamer(name):
    def wrapper(func):
        func.__name__ = name
        return func
    return wrapper

@renamer('Not Test')
class Test: pass
print Test.__name__

Test.__name__ = 'Test Again'
print Test.__name__    

将同时改变班级名称。

答案 3 :(得分:1)

改为覆盖__repr__

>>> class SomeClass(object):
...   def __repr__(self):
...     return 'I am a SomeClass instance.'

答案 4 :(得分:1)

您可以使用元类来实现此目的。

观察:

>>> class MyMeta(type):
...     def __init__(cls, name, bases, dct):
...             super(MyMeta, cls).__init__(name, bases, dct)
...
...     def __repr__(self):
...             return "MyMeta is Cool: " + self.__name__
...
>>> class FooType(metaclass=MyMeta):
...     pass
...
>>> FooType
MyMeta is Cool: FooType