You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python原型模式问题:重写__str__后打印对象仍显示内存地址

为什么Python原型模式里我的__str__方法没生效?

嘿,我帮你捋捋这个问题!你说打印c1的时候还是输出默认的内存地址格式,但明明加了__str__方法对吧?大概率是你把__str__放错地方啦!

先看你的代码结构:你写了Prototype这个原型管理器类,但真正要被克隆的是Car类对吧?如果你的__str__方法是定义在Prototype类里,那Car的实例肯定不会调用它啊——Python调用__str__是看对象本身所属的类的。

举个正确的示例,你应该把__str__加到Car类里,再用原型管理器来克隆它:

import copy

class Car:
    def __init__(self, brand, model):
        self.brand = brand
        self.model = model
    
    # 把__str__定义在Car类里才对!
    def __str__(self):
        return f"Car(brand={self.brand}, model={self.model})"

class Prototype:
    def __init__(self):
        self._objects = {}
    
    def register_object(self, name, obj):
        self._objects[name] = obj
    
    def unregister_object(self, name):
        if name in self._objects:
            del self._objects[name]
    
    def clone(self, name, **kwargs):
        # 克隆已注册的对象,支持修改属性
        obj = copy.deepcopy(self._objects.get(name))
        obj.__dict__.update(kwargs)
        return obj

# 测试代码
if __name__ == "__main__":
    prototype = Prototype()
    # 注册一个Car原型实例
    prototype.register_object("tesla_model3", Car("Tesla", "Model 3"))
    # 克隆得到新对象
    c1 = prototype.clone("tesla_model3")
    print(c1)  # 现在会输出:Car(brand=Tesla, model=Model 3)

另外还要排查几个常见坑点:

  • 是不是拼写错了方法名?比如写成__strr__或者混淆了__str__和__repr__(后者是调试用的字符串格式,和打印显示的逻辑不同)
  • 克隆时有没有用对copy模块的方法?不管是浅拷贝copy.copy还是深拷贝copy.deepcopy,都会保留原对象的__str__方法
  • 确认c1确实是Car类的实例——如果c1是Prototype管理器的对象,那就算Car有__str__也没用

下次遇到这种问题,先打印type(c1)看看对象的类型,再检查__str__是不是定义在这个类型的类里,一查一个准!

内容的提问来源于stack exchange,提问作者kingkramer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:57:21