首页 > 解决方案 > 用于任务管道的 Python 模式

问题描述

我正在尝试在汽车对象上创建一个简单的管道

  1. 制造汽车的轮子
  2. 给汽车加刹车
  3. 存放汽车

我为此任务开发的代码是:

def build_brakes(car) :
    car.brakes = 'new high quality brakes'
    return car
        
class Car :
    def __init__(self , wheels):
        self.wheels = wheels
        self.jsonTransform = {}
        self.jsonTransform['wheels'] = wheels
        
    def toJson(self):
        return self.jsonTransform

def store(car):
    return 'car' , car , 'stored'
    
c = Car("wheels")
print(c.toJson())

car_with_brakes = build_brakes(c)
print(car_with_brakes.toJson())

stored = store(c)
print(stored)

哪个打印:

{'wheels': 'wheels'}
{'wheels': 'wheels'}
('car', <__main__.Car object at 0x7f40a86bdcf8>, 'stored')

print(car_with_brakes.toJson())打印{'wheels': 'wheels'}。有没有我可以使用的模式来为汽车和brakes属性生成 JSON 并封装上述管道?我可以创建一个名为的新类CarWithBrakes,例如:

class CarWithBrakes(Car):
    
    def __init__(self , car, brakes):
        self.car = car
        self.brakes = brakes

    def toJson(self):
        self.jsonTransform = {}
        self.jsonTransform['wheels'] = self.car.wheels
        self.jsonTransform['brakes'] = self.car.brakes
        return self.jsonTransform
    
car_with_brakes = CarWithBrakes(c , 'new high qualiy brakes')

car_with_brakes.toJson()

打印:

{'wheels': 'wheels', 'brakes': 'new high qualiy brakes'}

但这对于一个看似简单的问题来说似乎太过分了?

标签: pythondesign-patterns

解决方案


你有几个选择。

一是调整build_brakes功能:

# note brakes x breaks
def build_brakes(car) :
    car.brakes = 'new high quality brakes'
    car.jsonTransform['breaks'] = car.brakes
    return car

另一个(IMO 更清洁)是修改toJson方法:

# note brakes x breaks
class Car :
    def __init__(self , wheels):
        self.wheels = wheels
    def toJson(self):
        ret = {'wheels':self.wheels}
        if hasattr(self,"brakes"):
            ret['breaks'] = self.brakes
        return ret

推荐阅读