【问题标题】:TypeError: descriptor '__init__' requires a 'super' object but received a 'str'TypeError:描述符“__init__”需要一个“超级”对象但收到一个“str”
【发布时间】:2018-01-20 07:29:05
【问题描述】:

使用 Python 3.X 作为解释器。我刚刚继承了Employee 类,其中两个派生类为DeveloperManager

以下代码引发类型错误:'__init__' requires a 'super' object but received a 'str'
我不明白为什么会发生这种情况,我还没有发现程序有任何问题。

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)
        print ("Total no of Employee are :%d" %(Employee.emp_count))


    def raise_amount(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:
            print (emp.fullnamme())



dev1=Developer("subhendu","panda",500000,"Python")
dev1.raise_amount()
dev2=Developer('Aditya','bishoyi',5688989,'java')
dev2.fullname()
dev1.fullname()
emp1=Employee("tonu","trip",30000)
emp1.raise_amount()
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()

错误跟踪:

Traceback (most recent call last): 
File "C:/Users/Subhendu/PycharmProjects/hello/inheritance.py", line 56, in 
<module> dev1=Developer("subhendu","panda",500000,"Python") 
File "C:/Users/Subhendu/PycharmProjects/hello/inheritance.py", line 27, in
init super.__init__(f,l,a) TypeError: descriptor 'init' requires a 'super'
object but received a 'str'

【问题讨论】:

  • 故意(重复问题正文)以避开(提供一个最小的例子),投反对票。如果重复该行为,您可能无法再提问。
  • 发布您的错误回溯,而不仅仅是消息。当该信息已经在回溯中时,您要求我们找出问题所在。
  • 你需要实际调用 super - 即super().__init__()
  • 那是错误的。我已经删除了重复的。不过,如果你确实有问题,你可以做必要的事情。感谢您的支持
  • Traceback(最近一次调用最后):文件“C:/Users/Subhendu/PycharmProjects/hello/inheritance.py”,第 56 行,在 dev1=Developer("subhendu"," panda",500000,"Python") 文件“C:/Users/Subhendu/PycharmProjects/hello/inheritance.py”,第 27 行,在 init super.__init__(f,l,a) TypeError : 描述符“init”需要一个“超级”对象,但收到了一个“str”

标签: python python-3.x python-2.7


【解决方案1】:

将您所有的super.__init__(...) 呼叫更改为super().__init__(...)。问题是缺少一对括号()

从Python 3.3官方参考here来看,super实际上是一个带有签名super([type[, object-or-type]])的内置函数。

【讨论】:

    【解决方案2】:

    您在Developer 类中给出错误的super 调用应该是:

    super(Developer, self).__init__(f, l, a) 
    

    Manager 类中:

    super(Manager, self).__init__(f, l, a)
    

    您还有其他问题,例如,在Employee 中,您有两个名为raise_amount 的属性,一个是float,一个是方法(函数)。这是不允许的,float 优先,所以dev1.raise_amount() 失败。

    print_employee() 中你拼错了emp.fullname

    【讨论】:

    • 谢谢,执行得很好。
    【解决方案3】:
    def __init__(self,millage,cost,name,tyre,hp):
        super().__init__(millage,cost)
        self.name=name
        self.tyre=tyre
        self.hp=hp
    

    super() 你忘了放 ()

    【讨论】:

    • 请尽量给出高质量的答案。这个方案两年前就已经有人提供了?
    猜你喜欢
    • 2021-07-29
    • 2018-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多