我理解如何提供对象的实例的非正式表示,但我有兴趣提供类名的非正式字符串表示。
具体来说,我想覆盖打印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.
答案 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