如何为类定义__str__方法?

kjo*_*kjo 26 python

在Python中,object该类充当所有(新式)类的根超类.至少默认情况下,应用strrepr任何子类的"类实例" object会产生相同的结果:

>>> class spam(object): pass
... 
>>> str(spam)
"<class '__main__.spam'>"
>>> str(spam) == repr(spam)
Run Code Online (Sandbox Code Playgroud)

我想定义的一个子类object,比方说fancyobject,也就是等同于object以各种方式,不同之处在于施加strreprfancyobject自身产生不同的输出:

>>> class ham(fancyobject): pass
...
>>> str(ham)
'ham'
>>> repr(ham)
"<class '__main__.ham'>"
Run Code Online (Sandbox Code Playgroud)

有没有办法在Python中执行此操作?

PS:我知道__str__特殊的方法,但我的理解是,如果类A重写__str__,那么只有str在实例上调用时才会调用重写方法A,而不是在调用它A本身时调用.即:

>>> class A(object):
...     def __str__(self):
...         return 'from new __str__: ' + object.__str__(self)
... 
>>> str(A())
'from new __str__: <__main__.A object at 0x7f79c62a5310>'
>>> str(A)
"<class '__main__.A'>"
Run Code Online (Sandbox Code Playgroud)

Sve*_*ach 35

实际上,与对象实例相同的机制适用于类型.类型只是对象本身,因此通过调用类型的__str__()方法(称为"元类")将它们转换为字符串.所以你必须覆盖元类的方法:__str__()

class fancytype(type):
    def __str__(self):
        return self.__name__
class ham(object):
    __metaclass__ = fancytype
print ham
Run Code Online (Sandbox Code Playgroud)

版画

ham
Run Code Online (Sandbox Code Playgroud)


Joh*_*ooy 5

您还可以为这样的整个模块设置默认元类

class fancytype(type):
    def __str__(self):
        return self.__name__

__metaclass__ = fancytype

class ham:
    pass
print ham
Run Code Online (Sandbox Code Playgroud)

  • @kjo:嗯,这个例子中的类`ham`将自动成为一个新式的类,因为`fancytype`派生自`type`,这是新式类的类型.源自`ham`的所有​​东西也都是一种"花式". (2认同)