是否有必要检查flyweight模式中的初始状态?

时间:2014-12-16 21:47:46

标签: python design-patterns

以下是一些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__函数只会被调用一次。

1 个答案:

答案 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")测试)。