如何为类的所有实例设置实例属性

时间:2018-08-24 17:36:01

标签: python-3.x class

我有以下汽车课。我希望能够将所有汽车类实例的里程数重置为0。如何做到这一点?

class Car():

        carpark = []

        # initialising instance

        def __init__(self, brand, color, fuel, mileage):
            self.brand = brand
            self.color = color
            self.fuel = fuel
            self.mileage = mileage
            self.drives = []

            Car.carpark.append(self)

        @classmethod
        def purchase(cls, brand, color):
            cls(brand, color, "Diesel", 0)

因为我有停车场清单,所以我可以做类似的事情:

@classmethod
def reset_mileage(cls):
for car in cls.carpark:
    car.mileage = 0 

这行得通,但我想知道是否有更好,更清洁的方式来做到这一点?

1 个答案:

答案 0 :(得分:1)

可以使用Python的property功能延迟更新属性-只需在类上保留一个tick计数器,并在每个实例上保留一个对应的tick

class Car:
   cls_mileage = 0 
   cls_mileage_tick = 0

   @classmethod
   def reset_mileage(cls, value=0):
       cls.cls_mileage = value
       cls.cls_mileage_tick = value


   def __init__(self):
       self.mileage_tick = self.cls_mileage_tick
       self.mileage = 0

   @property 
   def mileage(self):
       if self._mileage_tick < self.cls_mileage_tick:
           self._mileage_tick = self.cls_mileage_tick
           self._mileage = self.cls_mileage
       return self._mileage

   @mileage.setter
   def mileage(self, value):
       self._mileage_tick = self.cls_mileage_tick
       self._mileage = value

以下是@property装饰器的一些说明。最重要的是,这是某种“反应模式”。 -https://www.programiz.com/python-programming/property

当然,如果您需要很多属性,则此模式每个都需要大量代码,有多种方法可以使用__getattribute____setattr__魔术方法来实现这种通用。

此外,如果您可以确定是否要在实例或类本身上获取和设置属性,则无需在两个类属性上都使用额外的cls_前缀:可以重新命名-使用。