![](/img/trans.png)
[英]Python 3: How do I get a string literal representation of a byte string?
[英]How do I provide an informal string representation of a python Class (not instance)
我了解如何提供對象實例的非正式表示形式,但我對提供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.
您的問題稱為元類混亂。 對於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__
做同樣的__repr__
。
您將必須重寫元類的__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>
>>>
更改類的字符串表示形式:
class MC(type):
def __repr__(cls):
return 'I am Test'
class Test:
__metaclass__ = MC
pass
print Test
工作正常。
如果在定義__str__
時調用repr(Test)
,它將不會使用您的自定義消息。
但是,如果你定義__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__
都可以更改班級名稱。
__repr__
。
>>> class SomeClass(object):
... def __repr__(self):
... return 'I am a SomeClass instance.'
您可以使用元類來實現。
觀察:
>>> 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.