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

2024-05-14 17:25:16 发布

您现在位置:Python中文网/ 问答频道 /正文

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

因此,具体来说,我想重写打印类(优main_uu.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.

Tags: 对象实例instance字符串内容maindefam
3条回答

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

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

class Test:
    __metaclass__ = MC
   pass

print Test

工作正常。在

如果在定义__str__时调用了repr(Test),它将不会使用您的托管消息。在

但是,如果您像我一样定义__repr__,并且调用了str(Test),它将使用您的托管消息,因为__repr__是后备,而{}没有在{}中定义。在

如果您只想更改它的名称:

^{pr2}$

都会改变类名。在

您必须重写元类__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>
>>> 

你的问题被称为元类混淆。对于类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__也可以这样做。在

相关问题 更多 >

    热门问题