簡體   English   中英

如何提供python類(而非實例)的非正式字符串表示形式

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM