首页 > 解决方案 > 如何为类的所有实例设置实例属性

问题描述

我有以下汽车类。我希望能够将所有汽车类实例的里程数重置为 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 

这可行,但我想知道是否有更好、更清洁的方法来做到这一点?

标签: python-3.xclass

解决方案


可以使用 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_在两个类属性上都添加额外的前缀:名称可以重复使用。


推荐阅读