Python 3.X继承类调用super.__init__出现TypeError错误排查
解决 TypeError: descriptor 'init' requires a 'super' object but received a 'str'
首先,触发这个错误的核心原因是你在派生类中调用父类构造函数的方式有误:
在Developer和Manager类的__init__方法里,你写的是:
super.__init__(f,l,a)
这里的super是Python内置的类,你需要调用它生成一个super对象才能访问父类的方法,正确的写法应该是:
super().__init__(f,l,a)
你直接用类super去调用它的__init__方法,而非super()创建的实例,这才导致了那个TypeError。
除了这个核心错误,你的代码里还有几个隐藏问题,不修复的话运行还是会报错,我一起帮你整理出来:
属性与方法命名冲突
在Employee类中,你同时定义了类属性raise_amount和同名的实例方法raise_amount,这会导致方法覆盖属性,调用dev1.raise_amount()时会出问题。建议把方法名改成apply_raise这类不重复的名称:def apply_raise(self): self.amount *= self.raise_amount return self.amount属性名拼写不一致
Employee类的print1方法里用了self.email,但你在构造函数中定义的是self.email_id,需要统一名称:def print1(self): print(self.email_id) print("Total no of Employee are :%d" % (Employee.emp_count))方法名拼写错误
Manager类的print_employee方法里调用了emp.fullnamme(),多写了一个m,应该是emp.fullname();而且fullname方法本身已经包含print操作,不需要再用print()包裹:def print_employee(self): for emp in self.my_employee: emp.fullname()
修复后的完整可运行代码如下:
class Employee: raise_amount = 1.05 emp_count = 0 def __init__(self, first_name, last_name, amount): self.first_name = first_name self.last_name = last_name self.amount = amount self.email_id = "{0}.{1}@{1}.com".format(first_name, last_name) Employee.emp_count += 1 def fullname(self): print("%s %s" % (self.first_name, self.last_name)) def print1(self): print(self.email_id) print("Total no of Employee are :%d" % (Employee.emp_count)) def apply_raise(self): self.amount *= self.raise_amount return self.amount class Developer(Employee): raise_amount = 1.10 def __init__(self, f, l, a, prog): super().__init__(f, l, a) self.programming = prog class Manager(Employee): def __init__(self, f, l, a, emp=None): super().__init__(f, l, a) if emp is None: self.my_employee = [] else: self.my_employee = emp def add_employee(self, emp): if emp in self.my_employee: print("employee is already exist") else: self.my_employee.append(emp) def remove_employee(self, emp): if emp in self.my_employee: self.my_employee.remove(emp) def print_employee(self): for emp in self.my_employee: emp.fullname() dev1 = Developer("subhendu", "panda", 500000, "Python") dev1.apply_raise() dev2 = Developer('Aditya', 'bishoyi', 5688989, 'java') dev2.fullname() dev1.fullname() emp1 = Employee("tonu", "trip", 30000) emp1.apply_raise() emp1.fullname() mgr1 = Manager("Biplab", "choudhury", 5000000) mgr1.fullname() mgr1.add_employee(dev1) mgr1.add_employee(emp1) mgr1.add_employee(dev2) mgr1.print_employee() mgr1.remove_employee(dev1) mgr1.print_employee()
现在运行这段代码就能正常执行所有逻辑,不会再出现之前的错误了。
内容的提问来源于stack exchange,提问作者SUBHENDU PANDA
相关产品推荐
相关产品推荐

