Python Employee类打印报错:NameError: self未定义 求助修复
修复Python类与子类属性打印的问题
错误原因分析
self误用:self仅能在类的实例方法内部使用,main()是普通函数,不能直接用self,必须通过创建的实例对象访问属性。- 子类定义错误:你把
ProductionWorker写成了Employee的方法,正确做法是让它作为继承Employee的独立子类。 - 属性访问错误:你把实例属性当成方法调用(比如
self.name()),但这些是实例变量,不需要加括号。 - print语句语法错误:语句里混用逗号和加号,还有多余逗号,导致语法异常。
修正后的完整代码
class Employee: def __init__(self, name, number): self.name = name self.number = number # 定义子类ProductionWorker,继承Employee class ProductionWorker(Employee): def __init__(self, name, number, shift_number, hourly_pay): # 调用父类初始化方法,复用属性逻辑 super().__init__(name, number) self.shift_number = shift_number self.hourly_pay = hourly_pay def main(): employee_name = input("Please enter your name: ") employee_number = input("Please enter your employee number: ") employee_shift = input("Please enter your shift number: ") employee_pay = input("Please enter your hourly wage: ") # 创建子类实例 worker = ProductionWorker(employee_name, employee_number, employee_shift, employee_pay) # 用f-string格式化输出,避免拼接语法错误 print(f"Your name is {worker.name}, your employee number is {worker.number}, your shift number is {worker.shift_number}, your pay is {worker.hourly_pay} an hour.") main()
关键修复说明
- 子类继承逻辑:
ProductionWorker(Employee)明确子类身份,通过super().__init__()调用父类构造方法,复用父类的属性初始化逻辑。 - 实例属性访问:在
main()中通过worker实例直接访问所有属性(如worker.name),替代错误的self用法。 - 输出优化:使用f-string格式化输出,既避免字符串拼接的语法问题,也让代码更易读。
- 命名规范:将
Snumber改为shift_number、Pay改为hourly_pay,符合Python变量命名的小写加下划线规范。
内容的提问来源于stack exchange,提问作者user20524281
相关产品推荐
相关产品推荐

