Python 如何为一个类定义一个_ustr__;方法?
在Python中,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
对象
类充当所有(新样式)类的根超类。至少在默认情况下,将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_____
。显然,这个更改从未进入发行版,目前我找不到任何引用。我将从答案中删除注释。