Composition 和 Inheritance

"""
这段代码是检查汽车是否启动,其中pump method好像不起作用,要让pressure>0,车子才能启动,应该怎么修改
"""
class Car:
    def __init__(self,VIN,engine,tires):
        self.VIN=VIN
        self.engine=engine
        self.tires=tires
class Tires:
    def __init__(self,size):
        self.size=size
        self.pressure=0
    def get_pressure(self):
        return self.pressure
    def pump(self,psi):
        self.pressure=psi
class Engine:
    def __init__(self,fuel_type):
        self.fuel_type=fuel_type
        self.state='off'
    def start(self):
        self.state = 'on'
    def stop(self):
        self.state = 'off'
    def get_state(self):
        return self.state
city_tires=Tires(15)
off_road_tires=Tires(18)
electric_engine=Engine('electric')
petrol_engine=Engine('petrol')
city_car=Car('111A',electric_engine,city_tires)
all_terrain_car=Car('888S',petrol_engine,off_road_tires)
        
print('All-terrain car engine is', all_terrain_car.engine.get_state())
all_terrain_car.tires.pump(10)
 

all_terrain_car.engine.start()
print('All-terrain car engine is', all_terrain_car.engine.get_state())

all_terrain_car.engine.stop()
print('All-terrain car engine is', all_terrain_car.engine.get_state())

all_terrain_car.engine.start()
print('All-terrain car engine is', all_terrain_car.engine.get_state())
print(all_terrain_car.tires.get_pressure()) 

print('City car engine is', city_car.engine.get_state())

city_car.engine.start()
print('City car engine is', city_car.engine.get_state())

city_car.engine.stop()
print('City car engine is', city_car.engine.get_state())

class Car:
    def __init__(self,VIN,engine,tires):
        self.VIN=VIN
        self.engine=engine
        self.tires=tires
        self.engine.tires=tires#动态给这辆车的引擎添加关联的轮胎,因为要判断胎压,需要在引擎中检查胎压,建立联系
class Tires:
    def __init__(self,size):
        self.size=size
        self.pressure=0
    def get_pressure(self):
        return self.pressure
    def pump(self,psi):
        self.pressure=psi
class Engine:
    def __init__(self,fuel_type):
        self.fuel_type=fuel_type
        self.state='off'
    def start(self):
        if self.tires.pressure>0:#这里获取动态添加的引擎关联的轮胎胎压进行判断
            self.state = 'on'
    def stop(self):
        self.state = 'off'
    def get_state(self):
        return self.state
city_tires=Tires(15)
off_road_tires=Tires(18)

electric_engine=Engine('electric')
petrol_engine=Engine('petrol')

city_car=Car('111A',electric_engine,city_tires)
all_terrain_car=Car('888S',petrol_engine,off_road_tires)
        
print('All-terrain car engine is', all_terrain_car.engine.get_state())
all_terrain_car.tires.pump(10)
 
 
all_terrain_car.engine.start()
print('All-terrain car engine is', all_terrain_car.engine.get_state())
 
all_terrain_car.engine.stop()
print('All-terrain car engine is', all_terrain_car.engine.get_state())
 
all_terrain_car.engine.start()
print('All-terrain car engine is', all_terrain_car.engine.get_state())
print(all_terrain_car.tires.get_pressure()) 
 
print('City car engine is', city_car.engine.get_state())
 
city_car.engine.start()
print('City car engine is', city_car.engine.get_state())
 
city_car.engine.stop()
print('City car engine is', city_car.engine.get_state())
 

你题目的解答代码如下:

"""
这段代码是检查汽车是否启动,其中pump method好像不起作用,要让pressure>0,车子才能启动,应该怎么修改
"""
class Car:
    def __init__(self,VIN,engine,tires):
        self.VIN=VIN
        self.engine=engine
        self.tires=tires
        self.engine.car = self
class Tires:
    def __init__(self,size):
        self.size=size
        self.pressure=0
    def get_pressure(self):
        return self.pressure
    def pump(self,psi):
        self.pressure=psi
class Engine:
    def __init__(self,fuel_type):
        self.fuel_type=fuel_type
        self.state='off'
        self.car = None
    def start(self):
        if self.car.tires.get_pressure()>0:
            self.state = 'on'
    def stop(self):
        self.state = 'off'
    def get_state(self):
        return self.state
city_tires=Tires(15)
off_road_tires=Tires(18)
electric_engine=Engine('electric')
petrol_engine=Engine('petrol')
city_car=Car('111A',electric_engine,city_tires)
all_terrain_car=Car('888S',petrol_engine,off_road_tires)

print('All-terrain car engine is', all_terrain_car.engine.get_state())
all_terrain_car.tires.pump(10)


all_terrain_car.engine.start()
print('All-terrain car engine is', all_terrain_car.engine.get_state())

all_terrain_car.engine.stop()
print('All-terrain car engine is', all_terrain_car.engine.get_state())

all_terrain_car.engine.start()
print('All-terrain car engine is', all_terrain_car.engine.get_state())
print(all_terrain_car.tires.get_pressure())

print('City car engine is', city_car.engine.get_state())

city_car.engine.start()
print('City car engine is', city_car.engine.get_state())

city_car.engine.stop()
print('City car engine is', city_car.engine.get_state())

如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!

img


"""
这段代码是检查汽车是否启动,其中pump method好像不起作用,要让pressure>0,车子才能启动,应该怎么修改
"""


class Car:
    def __init__(self, VIN, engine, tires):
        self.VIN = VIN
        self.engine = engine
        self.tires = tires
        if(self.tires.get_pressure()>0):
            self.engine.start()


class Tires:
    def __init__(self, size):
        self.size = size
        self.pressure = 0

    def get_pressure(self):
        return self.pressure

    def pump(self, psi):
        self.pressure = psi


class Engine:
    def __init__(self, fuel_type):
        self.fuel_type = fuel_type
        self.state = 'off'

    def start(self):
        self.state = 'on'

    def stop(self):
        self.state = 'off'

    def get_state(self):
        return self.state


city_tires = Tires(15)
off_road_tires = Tires(18)
electric_engine = Engine('electric')
petrol_engine = Engine('petrol')
city_car = Car('111A', electric_engine, city_tires)
all_terrain_car = Car('888S', petrol_engine, off_road_tires)

print('All-terrain car engine is', all_terrain_car.engine.get_state())
all_terrain_car.tires.pump(10)

all_terrain_car.engine.start()
print('All-terrain car engine is', all_terrain_car.engine.get_state())

all_terrain_car.engine.stop()
print('All-terrain car engine is', all_terrain_car.engine.get_state())

all_terrain_car.engine.start()
print('All-terrain car engine is', all_terrain_car.engine.get_state())
print(all_terrain_car.tires.get_pressure())

print('City car engine is', city_car.engine.get_state())

city_car.engine.start()
print('City car engine is', city_car.engine.get_state())

city_car.engine.stop()
print('City car engine is', city_car.engine.get_state())

标题是Composition 和 Inheritance,结果你用的是Aggregation。
Composition 中类与类的关系是强相关,Aggregation是弱相关,所以你这里可以单独调用引擎的方法,而与轮胎的压力没有任何关系。
如果打个比喻的话,轮胎可以拆下来单独增压,使用弱相关的类聚合没有问题,而引擎单独拆下来发动不了啊,所以它的启动和暂停应该在Car类中定义。当然,用继承也做得到。

class Car:
    def __init__(self,VIN,engine,tires):
        self.VIN=VIN
        self.engine=Engine(engine)
        self.tires=Tires(tires)
    def start(self):
        if self.tires.pressure>0:
            self.engine.state='on'
    def stop(self):
        self.engine.state='off'
class Tires:
    def __init__(self,size):
        self.size=size
        self.pressure=0
    def get_pressure(self):
        return self.pressure
    def pump(self,psi):
        self.pressure=psi
class Engine:
    def __init__(self,fuel_type):
        self.fuel_type=fuel_type
        self.state='off'
    # def start(self):
    #     self.state = 'on'
    # def stop(self):
    #     self.state = 'off'
    def get_state(self):
        return self.state
# city_tires=Tires(15)
# off_road_tires=Tires(18)
# electric_engine=Engine('electric')
# petrol_engine=Engine('petrol')
city_car=Car('111A','electric',15)
all_terrain_car=Car('888S','petrol',18)
        
print('All-terrain car engine is', all_terrain_car.engine.get_state())
all_terrain_car.tires.pump(10)
 
# all_terrain_car.engine.start()
all_terrain_car.start()
print('All-terrain car engine is', all_terrain_car.engine.get_state())
 
# all_terrain_car.engine.stop()
all_terrain_car.stop()
print('All-terrain car engine is', all_terrain_car.engine.get_state())
 
# all_terrain_car.engine.start()
all_terrain_car.start()
print('All-terrain car engine is', all_terrain_car.engine.get_state())
print(all_terrain_car.tires.get_pressure()) 
 
print('City car engine is', city_car.engine.get_state())
 
# city_car.engine.start()
city_car.start()
print('City car engine is', city_car.engine.get_state())
 
# city_car.engine.stop()
city_car.stop()
print('City car engine is', city_car.engine.get_state())
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632