在Python中,object该类充当所有(新式)类的根超类.至少默认情况下,应用str和repr任何子类的"类实例" object会产生相同的结果:
>>> class spam(object): pass
...
>>> str(spam)
"<class '__main__.spam'>"
>>> str(spam) == repr(spam)
Run Code Online (Sandbox Code Playgroud)
我想定义的一个子类object,比方说fancyobject,也就是等同于object以各种方式,不同之处在于施加str和repr对fancyobject自身产生不同的输出:
>>> 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)
您还可以为这样的整个模块设置默认元类
class fancytype(type):
def __str__(self):
return self.__name__
__metaclass__ = fancytype
class ham:
pass
print ham
Run Code Online (Sandbox Code Playgroud)