在Python中,object
类充当所有(新式)类的根超类。默认情况下,将str
和repr
应用于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
答案 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