我有以下汽车课。我希望能够将所有汽车类实例的里程数重置为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
这行得通,但我想知道是否有更好,更清洁的方式来做到这一点?
答案 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_
前缀:可以重新命名-使用。