首页 > 解决方案 > 我不断收到此错误,但我不知道为什么(TypeError: __init__() 需要 2 个位置参数,但给出了 3 个)

问题描述

class User:
    def __init__(self, first_name, last_name):
        self.first_name = first_name
        self.last_name = last_name
    def describe_user(self):
        print(f"User information: {self.first_name} {self.last_name}")
    def greet_user(self):
        print(f"Hello {self.first_name} {self.last_name}!")

class Admin:
    def __init__(first_name, last_name):
        super().__init__(self, first_name, last_name)
    def list_privileges(self):
        self.privilege = ["Can add post", "Can ban user", "Can delete post"]
    def show_privileges(self):
        for priv in self.privilege:
            print(priv)

my_user = Admin("John", "Smith")           <--------- (Where I get error)
my_user.show_privileges()       

标签: python

解决方案


在 Python 中,通常包含来自类和库的函数

<library name>.<function/attribute>(arguments)

其中库名称本身就是一个参数(在哪里可以找到函数。)
这意味着参数位于箭头指向的位置:

<library name>.<function/attribute>(argument 1,argument 2)
       ^                                ^            ^
       |                                |            |

但是,每当您调用诸如之类的函数时__init__,该函数都会执行它所说的:启动该函数。因此,调用Admin()本质上与Admin.__init__. 因此,存在三个属性:first_namelast_nameAdmin(__init__ 来自的类。) Admin 包含在修改中

    def __init__(self, first_name, last_name):

但是,当您运行它时,您会收到以下错误:

Traceback (most recent call last):
  File "main.py", line 25, in <module>
    my_user = Admin("John", "Smith")
  File "main.py", line 15, in __init__
    super().__init__(self, first_name, last_name)
TypeError: object.__init__() takes exactly one argument (the instance to initialize)

这个错误是非常自我引用的—— super() 就像一个类,而 __init__() 函数只接受一个参数——类名。因此,我们可以删除(self, first_name, last_name)并运行代码:

Traceback (most recent call last):
  File "main.py", line 27, in <module>
    my_user.show_privileges()
  File "main.py", line 21, in show_privileges
    for priv in self.privilege:
AttributeError: 'Admin' object has no attribute 'privilege'

这意味着self.privileges尚未定义。因为您还没有调用函数 show_privileges,所以只需将驱动程序代码(类外)替换为

my_user = Admin("John", "Smith")    
my_user.list_privileges()
my_user.show_privileges()  
"""
outputs 
Can add post
Can ban user
Can delete post
"""

希望这有效!


推荐阅读