python - 我不断收到此错误,但我不知道为什么(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 中,通常包含来自类和库的函数
<library name>.<function/attribute>(arguments)
其中库名称本身就是一个参数(在哪里可以找到函数。)
这意味着参数位于箭头指向的位置:
<library name>.<function/attribute>(argument 1,argument 2)
^ ^ ^
| | |
但是,每当您调用诸如之类的函数时__init__
,该函数都会执行它所说的:启动该函数。因此,调用Admin()
本质上与Admin.__init__
. 因此,存在三个属性:first_name
、last_name
和Admin
(__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
"""
希望这有效!
推荐阅读
- java - 当我使用来自 ReplaySubject 的 Observable 时阻止 ChannelHandlerContext
- c# - UWP - 使键盘快捷键调用函数而不使用控件?
- excel - 获得过滤条件的百分位数?
- ibm-doors - 在哪里可以查看 DOORS 中用户的最新编辑历史记录?
- sqlite - 在 Powershell 中使用 SQLite 提取日期在两天之间的数据
- python-2.7 - 从云功能触发数据流管道时,无法从主类执行超过 1 个功能
- r - 多次使用 %in% 的正确方法
- java - IntelliJ 在 Docker 中调试 Java 应用程序
- android - Android通过bottomsheet交互显示MainActivity
- docker-compose - 将变量从 jenkinsfile 传递给 docker-compose 作为环境变量