首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >о虚加载未定义dunder方法

о虚加载未定义dunder方法
EN

Stack Overflow用户
提问于 2022-02-01 23:32:34
回答 1查看 30关注 0票数 1
代码语言:javascript
复制
class T(): 
    ...


t = T()
t.__str__ = types.MethodType(lambda self: "qqqqqq", t)
print(t)  # default object.__repr__

С你向我解释了这种行为的原因。也许有什么解决办法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-01 23:37:03

str(t)调用t.__class__.__str__(t),而不是t.__str__()

代码语言:javascript
复制
class T: 
    pass


t = T()

t.__str__ = lambda: "foo"
print(t)            # <__main__.T object at 0x000001FA84DA7D60>
print(t.__str__())  # foo

T.__str__ = lambda self: "foo"
print(t)            # foo

这是因为特殊的方法对于如何查找它们有特殊的规则:

https://docs.python.org/3/reference/datamodel.html#special-method-lookup

对于自定义类,只有在对象的类型上定义而不是在对象的实例字典中定义时,才能保证特殊方法的隐式调用正确工作。

通常,解决方案是在实际的类中定义__str__,并根据需要通过类属性通知其实现,而不是在单个实例中对整个方法进行猴子修补:

代码语言:javascript
复制
class T: 
    def __str__(self):
        return "foo"


t = T()
print(t)  # foo
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70948957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档