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
相关产品推荐
相关产品推荐

