Python 如何为一个类定义一个_ustr__;方法?

Python 如何为一个类定义一个_ustr__;方法?,python,Python,在Python中,对象类充当所有(新样式)类的根超类。至少在默认情况下,将str和repr应用于object的任何子类的“类实例”会产生相同的结果: >>> class spam(object): pass ... >>> str(spam) "<class '__main__.spam'>" >>> str(spam) == repr(spam) 在Python中有没有实现这一点的方法 PS:我知道\uuuu str\uuu

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

>>> class spam(object): pass
... 
>>> str(spam)
"<class '__main__.spam'>"
>>> str(spam) == repr(spam)
在Python中有没有实现这一点的方法

PS:我知道
\uuuu str\uuuu
特殊方法,但我的理解是,如果类
A
重写
\uu str\uuu
,那么只有在
A
的实例上调用
str
时才调用重写方法,而不是在
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'>"
>>A类(对象):
...     定义(自我):
...         返回'from new _str _:'+对象。_str _(self)
... 
>>>str(A())
'来自新的_;街:'
>>>str(A)
""

实际上,与对象实例相同的机制适用于类型。类型本身就是对象,因此通过调用其类型上的
\uu str\uu()
方法(称为“元类”)将其转换为字符串。因此,您必须覆盖元类上的
\uuu str\uuu()
方法:

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

ham
ham

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

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

__metaclass__ = fancytype

class ham:
    pass
print ham

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

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

ham
ham

谢谢,这很有趣,但在我看来,它只适用于“经典”类。我看不出这种技术如何影响新样式类(直接或间接地继承自
对象)
@kjo:好吧,本例中的类
ham
将自动成为新样式类,因为
fancytype
派生自
type
,这是新样式类的类型。所有源于ham的内容都将是
fancytype
;到目前为止,我一直认为定义新型类的唯一方法是在
类ham(…):
语句的
(…)
子句中显式地包含
对象或它的某个子类。在我写这篇文章时,有人得到了Python 3.3和更高版本(应该)是如何改变这一点的指针吗?@JürgenA.Erhard(这是在Python 3.3发布之前),当时Python的当前开发版本将
str(some_type)
的结果更改为
some_type.\uu_____
。显然,这个更改从未进入发行版,目前我找不到任何引用。我将从答案中删除注释。