Python内部类创建Car对象遇属性访问及调用异常求助
让我们一步步拆解你遇到的问题,再给出正确的实现方案:
先看你代码里的核心问题
Engine类的构造函数错误
你的engine类的__init__方法第一个参数没写self——Python类的实例方法必须以self作为第一个参数,用来指代实例本身。另外参数和属性的映射也混乱了:比如你定义了fuel_type参数,但赋值时写的是self.fuel = fuel,这里fuel变量根本不存在,运行起来也会报错。对类实例的概念理解偏差
第一次创建my_car时,你传给engine参数的是字符串'v6',这意味着my_car.engine只是个普通字符串,不是engine类的实例,自然没法通过my_car.v6.lts访问属性(而且v6也不是car实例的属性)。第二次修改时,你写成
self.engine = engine(),但此时传入的engine参数是字符串'v6',Python会尝试把这个字符串当作函数调用,所以抛出TypeError: 'str' object is not callable的错误。
正确的实现方案
首先我们修正类的定义,遵循Python的命名惯例(类名用大驼峰写法,比如Car、Engine,而非小写):
第一步:定义正确的Engine类
class Engine: # self必须作为第一个参数,参数名和属性名对应清晰 def __init__(self, displacement_lts, kms_by_lts, fuel_type, valves): self.displacement_lts = displacement_lts # 发动机排量(升) self.kms_by_lts = kms_by_lts # 油耗(每升公里数) self.fuel_type = fuel_type # 燃料类型 self.valves = valves # 气门数
第二步:定义Car类并关联Engine实例
这里提供两种常用的实现方式:
方式1:先创建Engine实例,再传给Car
这种方式更灵活,允许你复用同一个Engine实例给多个Car:
class Car: def __init__(self, color, year, engine): self.color = color self.year = year # 这里的engine必须是Engine类的实例,而非字符串 self.engine = engine # 先创建Engine实例 v6_engine = Engine(displacement_lts=4, kms_by_lts=12, fuel_type="gasoline", valves=24) # 将Engine实例传入Car的构造函数 my_car = Car(color='blue', year='2010', engine=v6_engine) # 现在可以正常访问Engine的属性了 print(my_car.engine.displacement_lts) # 输出: 4 print(my_car.engine.fuel_type) # 输出: gasoline
方式2:Car内部直接创建Engine实例
如果不想单独创建Engine实例,可以让Car的构造函数接收Engine的参数,内部自动创建Engine对象:
class Car: def __init__(self, color, year, engine_displacement, engine_kms, engine_fuel, engine_valves): self.color = color self.year = year # 内部初始化Engine实例 self.engine = Engine(engine_displacement, engine_kms, engine_fuel, engine_valves) # 直接传入所有参数创建Car my_car = Car('blue', '2010', 4, 12, 'gasoline', 24) print(my_car.engine.valves) # 输出: 24
总结
关键是要明确:Car的engine属性应该是Engine类的实例,而不是字符串或其他类型。同时要注意类的构造函数必须包含self参数,参数和属性的映射要准确。
内容的提问来源于stack exchange,提问作者mlopez2305

