如何为类定义__str__方法?

时间:2011-11-15 22:23:41

标签: python

在Python中,object类充当所有(新式)类的根超类。默认情况下,将strrepr应用于object的任何子类的“类实例”会产生相同的结果:

>>> class spam(object): pass
... 
>>> str(spam)
"<class '__main__.spam'>"
>>> str(spam) == repr(spam)

我想定义一个object的子类,比如说fancyobject,除了应用object和{{1}之外,它在各个方面与str相同。 } repr本身产生不同的输出:

fancyobject

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

PS:我知道>>> class ham(fancyobject): pass ... >>> str(ham) 'ham' >>> repr(ham) "<class '__main__.ham'>" 特殊方法,但我的理解是,如果类__str__覆盖A,则仅在{{1}时调用重写方法在__str__的实例上调用,而不是在str本身调用它时。即:

A

3 个答案:

答案 0 :(得分:34)

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

class fancytype(type):
    def __str__(self):
        return self.__name__
class ham(object):
    __metaclass__ = fancytype
print ham

打印

ham

答案 1 :(得分:5)

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

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

__metaclass__ = fancytype

class ham:
    pass
print ham

答案 2 :(得分:2)

这是Python 3的新答案。基本上,您将元类作为关键字参数传递给类定义。

class fancytype(type):
    def __str__(self):
        return self.__name__
class ham(metaclass=fancytype):
    pass
print(ham)

打印

ham