以下是一些python书的例子:
import weakref
class CarModel:
_models = weakref.WeakValueDictionary()
def __new__(cls, model_name, *args, **kwargs):
"""
:type model_name: str
"""
model = cls._models.get(model_name)
if not model:
model = super().__new__(cls)
cls._models[model_name] = model
return model
def __init__(self, model_name, air=False, tilt=False, cruise_control=False, power_locks=False, alloy_wheels=False, usb_charger=False):
if not hasattr(self, "initted"):
self.model_name = model_name
self.air = air
self.tilt = tilt
self.cruise_control = cruise_control
self.power_locks = power_locks
self.alloy_wheels = alloy_wheels
self.usb_charger = usb_charger
self.initted = True
def check_serial(self, serial_number):
print("{0} not yet available on {1}".format(serial_number, self.model_name))
是否真的有必要检查对象是否已初始化?据我所见,__init__
函数只会被调用一次。
答案 0 :(得分:0)
这有点奇怪,因为它覆盖了__new__,因此可以跟踪存储库中不同型号的汽车。
所以你可以这样做:
c = CarModel('ford')
<cars.CarModel at 0x7fb39dfc1be0>
c = CarModel('vw')
<cars.CarModel at 0x7fb39df72668>
c = CarModel('ford')
<cars.CarModel at 0x7fb39dfc1be0>
注意第二次调用CarModel('ford')
实际上如何返回同一个对象(0x7fb39dfc1be0)? __new__包含所有不同型号汽车的存储库,如果您创建的汽车具有您之前使用的相同型号名称,则只需获得旧汽车的副本。
有一点需要注意的是,你在第二次传递的额外参数完全被忽略了(因为它没有通过not hasattr(self, "initted")
测试)。