为什么我提供正确的位置参数但仍然会收到错误消息?

时间:2017-06-09 07:40:16

标签: python

我遇到以下代码的问题:

class User:

def __init__(self, first_name, last_name, **profile):
    self.profile = profile
    self.first_name = first_name
    self.last_name = last_name`
    self.profile['first_name'] = first_name
    self.profile['last_name'] = last_name

def query(self, key):
    value = self.profile[key]
    print('Here is the result:' + '\n\t' + str(value))


class UserVip(User):
def __init__(self, first_name, last_name, **profile):
    super().__init__(self, first_name, last_name, **profile)


ron_weasley = UserVip('ron', 'weasley', 
                  age=17,`enter code here
                  school='hogwarts'
                  )

当我运行它时,我收到了此错误消息

TypeError: __init__() takes 3 positional arguments but 4 were given

但是' **个人资料可以收到任何数量的论点,可以吗?然后我检查了论点,并尝试了这样

ron_weasley = UserVip('ron', 'weasley', 
                      school='hogwarts'
                      )

它出了问题。我还尝试了其他一些方法,并在网上搜索了很长时间。但没用。我是否误解了 init (),继承或' **(dict)'?请帮助或尝试提供一些如何解决此问题的建议。提前谢谢。

4 个答案:

答案 0 :(得分:2)

您不必在调用父self

时重复__init__参数 应该是: super().__init__(first_name, last_name, **profile)

答案 1 :(得分:1)

我认为您不应该在self中使用super().__init__(self, first_name, last_name, **profile)。 这是一个有效的代码:

class User:
    def __init__(self, first_name, last_name, **profile):
        self.profile = profile
        self.first_name = first_name
        self.last_name = last_name
        self.profile['first_name'] = first_name
        self.profile['last_name'] = last_name

    def query(self, key):
        value = self.profile[key]
        print('Here is the result:' + '\n\t' + str(value))


class UserVip(User):
    def __init__(self, first_name, last_name, **profile):
        super().__init__(first_name, last_name, **profile)


ron_weasley = UserVip('ron', 'weasley', age=17, school='hogwarts')
ron_weasley.query('age')

答案 2 :(得分:-1)

首先,对于UserVip类的__init__,缩进是错误的。

其次,对于UserVip的超类构造函数,您应该使用User而不是super()。或者您可以从参数中删除self

以下代码适用于我。

class User:

    def __init__(self, first_name, last_name, **profile):
        self.profile = profile
        self.first_name = first_name
        self.last_name = last_name
        self.profile['first_name'] = first_name
        self.profile['last_name'] = last_name

    def query(self, key):
        value = self.profile[key]
        print('Here is the result:' + '\n\t' + str(value))


class UserVip(User):
    def __init__(self, first_name, last_name, **profile):
        User.__init__(self, first_name, last_name, **profile)


ron_weasley = UserVip('ron', 'weasley', age=17,school='hogwarts')

答案 3 :(得分:-2)

您可以在代码中super代替classname

例如,使用下面的代码

调用父类__init__

User.__init__(self, first_name, last_name, **profile)

希望它能解决你的问题。 !