如题所述, 下述代码会导致无限递归。 这是对odoo中registry的简化, new 方法里面的东西是已经有的, 请问各位如何解决
import pickle
class Cache:
def __init__(self):
self.d = {}
def __setitem__(self, obj, val):
self.d[obj] = pickle.dumps(val)
def __getitem__(self, obj):
return pickle.loads(self.d[obj])
class Car:
cache = Cache()
def __reduce__(self):
return self.__class__, (self.name,)
def __new__(cls, name):
try:
return cls.cache[name]
except KeyError:
return cls.new(name)
@classmethod
def new(cls, name):
car = object.__new__(cls)
car.init(name)
cls.cache[name] = car
return car
def init(self, name):
self.name = name
def __repr__(self):
return self.name
a = Car('audi')
b = Car('audi')
object.__new__
會觸發Car
的__new__
。所以應該將new
改爲: