python-3.x - 如何为类的所有实例设置实例属性
问题描述
我有以下汽车类。我希望能够将所有汽车类实例的里程数重置为 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 的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_
在两个类属性上都添加额外的前缀:名称可以重复使用。