You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 20:10:30