燃油喷油器计算代码优化及统一入口实现方案问询
喷油器计算代码优化方案
1. 搞定全局变量依赖问题
把原来散在全局的参数,用数据类封装成配置对象,所有计算类都通过构造函数接收这个配置,彻底摆脱全局变量污染:
from dataclasses import dataclass @dataclass class InjectorConfig: # 集中管理所有计算所需参数,添加类型提示明确含义 flow_rate: float pressure: float fluid_density: float viscosity: float nozzle_diameter: float
这样每个计算实例的参数都是独立的,不会出现互相干扰的情况。
2. 重构类关系,复用通用逻辑
让LiquidJetInjector和GasJetInjector直接继承SimilarCalculations,不用先单独初始化通用类再实例化子类,逻辑更顺畅:
from enum import Enum class Reynolds(Enum): CRITICAL = 2300 TURBULENT = 4000 class SimilarCalculations: def __init__(self, config: InjectorConfig): self.config = config def calculate_reynolds_number(self) -> float: # 通用雷诺数计算逻辑 return (self.config.fluid_density * self.config.flow_rate * self.config.nozzle_diameter) / self.config.viscosity def is_turbulent_flow(self) -> bool: return self.calculate_reynolds_number() > Reynolds.TURBULENT.value class LiquidJetInjector(SimilarCalculations): def __init__(self, config: InjectorConfig): super().__init__(config) # 液体喷油器专属初始化逻辑写在这里 def calculate_liquid_penetration(self) -> float: # 直接复用父类的通用计算方法 reynolds = self.calculate_reynolds_number() return 0.1 * self.config.nozzle_diameter * (reynolds ** 0.5) class GasJetInjector(SimilarCalculations): def __init__(self, config: InjectorConfig): super().__init__(config) # 气体喷油器专属初始化逻辑写在这里 def calculate_gas_spread_angle(self) -> float: reynolds = self.calculate_reynolds_number() return 5.0 / (reynolds ** 0.2)
3. 创建统一入口,避免分别调用两类
写一个InjectorCalculator作为统一入口,用户只需要指定喷油器类型和配置,就能一键完成所有计算,不用关心背后的具体实现类:
class InjectorCalculator: def __init__(self, injector_type: str, config: InjectorConfig): self.injector_type = injector_type.lower() self.config = config self.injector = self._get_injector_instance() def _get_injector_instance(self): # 内部逻辑,用户无需关注 if self.injector_type == "liquid": return LiquidJetInjector(self.config) elif self.injector_type == "gas": return GasJetInjector(self.config) else: raise ValueError(f"不支持的喷油器类型:{self.injector_type}") def get_calculation_results(self): # 统一返回所有计算结果 results = { "雷诺数": self.injector.calculate_reynolds_number(), "是否湍流": self.injector.is_turbulent_flow() } if self.injector_type == "liquid": results["液体穿透率"] = self.injector.calculate_liquid_penetration() elif self.injector_type == "gas": results["气体扩散角"] = self.injector.calculate_gas_spread_angle() return results
使用示例
# 创建液体喷油器配置 liquid_config = InjectorConfig( flow_rate=0.01, pressure=1000000, fluid_density=800, viscosity=0.001, nozzle_diameter=0.001 ) # 统一入口调用,直接获取结果 liquid_calc = InjectorCalculator("liquid", liquid_config) print(liquid_calc.get_calculation_results()) # 气体喷油器操作同理 gas_config = InjectorConfig( flow_rate=0.05, pressure=500000, fluid_density=1.2, viscosity=1.8e-5, nozzle_diameter=0.002 ) gas_calc = InjectorCalculator("gas", gas_config) print(gas_calc.get_calculation_results())
4. 额外提升可读性的小技巧
- 给所有方法添加类型注解,一眼就能明确输入输出类型。
- 给类和方法加简短注释,说明核心功能,不用冗余描述。
- 把复杂计算拆成小方法,避免单个方法代码过长,逻辑混乱。
- 将
Reynolds枚举类放在计算类附近,方便引用查找。
内容的提问来源于stack exchange,提问作者Андрей Александров
相关产品推荐
相关产品推荐

