【问题标题】:TypeError: __init__() takes 3 positional arguments but 4 were givenTypeError: __init__() 接受 3 个位置参数,但给出了 4 个
【发布时间】:2018-03-07 01:01:18
【问题描述】:

这些是我的课程的代码:

class Employee:
    def __init__(self, name, gender):
        self.name = name
        self.gender = gender

class Salary:
    def jump(self, name, salary):
        print(self.name, self.salary)


class Male(Salary, Employee):
    def __init__(self, name, gender, occupation):
        super(Male, self).__init__(name, gender, occupation)
        self.occupation = occupation

# Separate from all classes (list of instantiated objects)
employee1 = Male("Jim", "male", "technician")
print(Male.name)

当我在创建所有类后使用代码的最后两行时,在引用 super(Male, self).... 和employee1 = Male(...行。

【问题讨论】:

  • super(Dog, self).__init__(name, color, owner) 参数太多
  • Extra,k = Klass()k.method()Klass.method(k) 完全相同。
  • 你使用继承错误; Male 不是 Salary 的一种。
  • 你也用super错了;你必须知道哪些类出现在Male 的方法解析顺序中,这样你就不会传递任何不期望的参数。有关正确使用super 的更多信息,请参阅rhettinger.wordpress.com/2011/05/26/super-considered-super

标签: python


【解决方案1】:
class Employee:
    def __init__(self,name,gender):
        self.name=name
        self.gender=gender

class Salary:
    def __init__(self,name,gender):
        self.name=name
        self.gender=gender
    def jump(self):
        print(self.name,self.salary)

class Male(Salary,Employee):
    def __init__(self,name,gender,occupation):
        self.occupation=occupation
        super().__init__(name,gender)


employee1 = Male("Jim","male","technician")
print(employee1.name)

"""你在super中写了职业参数,但是super调用了父类,而你的父类没有职业参数。职业只属于男类。"""

【讨论】:

    【解决方案2】:
    class Employee:
       def __init__(self, name, gender):
            self.name = name
            self.gender = gender
    
    class Salary:
      def __init__(self, name, gender):
        self.name = name
        self.gender = gender   
      def jump(self):
        print(self.name, self.salary)
    
    class Male(Salary, Employee):
        def __init__(self, name, gender, occupation):
          self.occupation = occupation
          Employee.__init__(self, name, gender)
          Salary.__init__(self, name, gender)
    
    employee1 = Male("Jim", "male", "technician")
    print(employee1.name)
    

    Python - Inheritance

    要访问基类Employee 的所有方法和属性,在派生类Male 中使用super() 函数。 示例中显示了使用super 函数的语法。 除此之外,请使用print(employee1.name) 而不是print(Male.name)

    【讨论】:

    • 请添加一些文字以澄清您的答案
    • 这仍然会失败,因为super().__init__ 会先尝试调用Salary.__init__
    • 修改了解决Salary.__init__的答案。
    【解决方案3】:

    在您拥有的宠物下:

    def __init__(self, name, color):
        self.name = name
        self.color = color
    

    在狗下你有:

    def __init__(self, name, color, owner):
        super(Dog, self).__init__(name, color, owner)
    

    在 Dog 下,给出了一个额外的所有者位置参数,这导致了这个错误。顺便说一句,我认为super().__init__(name, color) 在 Python 3 中也同样有效

    【讨论】:

      猜你喜欢
      • 2020-11-02
      • 2019-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-18
      • 2015-07-13
      • 1970-01-01
      • 2021-04-14
      相关资源
      最近更新 更多