请参阅下面我的回答;发布问题后我意识到发生了什么事。
我尝试使用装饰器覆盖类的字符串表示形式不起作用。我一定错过了一些东西,但不知道它是什么。
from functools import wraps
def str_dec(obj):
@wraps(obj.__str__)
def __str__(cls):
return '<desired result>'
obj.__str__ = __str__
return obj
@str_dec
class Test():
pass
assert Test.__str__(Test) == '<desired result>' # success
assert str(Test) == '<desired result>' # failure
显然是新的Test.__str__
方法已成功创建,但我希望它被调用str
功能。反而,str
正在使用默认的字符串创建方法(例如type
对象)。
我可以得到str
使用元类工作,但是然后__str__
方法不行!无论如何,我更喜欢使用装饰器。
class str_meta(type):
def __str__(cls):
return '<desired result>'
class Test(metaclass = str_meta):
pass
assert str(Test) == '<desired result>' # success
assert Test.__str__(Test) == '<desired result>' # failure
这里发生了什么?我怎样才能覆盖__str__
始终如一地为我的班级?
简而言之,__str__
方法影响类的行为实例,不是班级type.
对于您的第一个示例,以下内容确实有效:
assert str(Test()) == '<desired result>'
assert str(Test) == type.__str__(Test)
如果要修改的字符串化是类型,而不是其实例,则您确实需要一个元类,如第二个示例中所示。
我很好奇它的用例是什么。可以看到添加了一个classmethod
返回一个str
作为命名方法,但会对不响应的类型感到惊讶str()
as per repr()
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)