关于实例作为类对象的代码问题
本帖最后由 coward0720 于 2024-12-15 10:21 编辑最近遇到一个问题:
编写一个名为Privileges 的类,它只有一个属性——privileges ,其中存储了练习9-7 所说的字符串列表。将方法show_privileges() 移到这
个类中。在Admin 类中,将一个Privileges 实例用作其属性。创建一个Admin 实例,并使用方法show_privileges() 来显示其权限。
代码如下:
class User:
def __init__(self, first_name, last_name, login_attempts):
self.first = first_name
self.last = last_name
self.login = login_attempts
def describe_user(self):
print(f'这个用户的名字叫{self.first} {self.last.upper()}')
def greet_user(self):
print(f'Hello, {self.first} {self.last.title()}, FBI欢迎您~~~')
def increment_login_attempts(self):
self.login += 1
def reset_login_attempts(self):
self.login = 0
class Admin(User):
def __init__(self, privileges):
self.privileges = Privileges()
def show_privileges(self):
for i in self.privileges:
print(f'{i}')
class Privileges:
def __init__(self, privileges):
self.privileges = ['can add post', 'can delete post', 'can ban user']
def show_privileges(self):
for i in self.privileges:
print(f'{i}')
gao = Admin()
gao.privileges.show_privileges()
最后程序报错:
Traceback (most recent call last):
File "E:/GXY/pythonTest/练习专用/练习.py", line 543, in <module>
gao.privileges.show_privileges()
AttributeError: 'Privileges' object has no attribute 'show_privileges'
请问问题出在哪里呢?为什么Admin类不能直接调用Privileges类中的self.privileges呢? 看起来代码中有几个问题,导致了程序报错。我们来逐步解决这些问题:
1. **Admin类的构造函数有误**:你的`Admin`类的构造函数应该接受`first_name`, `last_name`, `login_attempts`以及`privileges`参数,并且要调用父类`User`的构造函数。
2. **Privileges类的属性名称和初始化**:`Privileges`类中你初始化的属性名称和你实际想要使用的属性名称不一致。同时,属性`self.pr`未设置任何初始值。
3. **调用错误的属性**:`gao.pr.show_privileges()`中使用了错误的属性名称,应为`gao.privileges.show_privileges()`。
以下是根据你的描述修改后的代码:
class User:
def __init__(self, first_name, last_name, login_attempts):
self.first = first_name
self.last = last_name
self.login = login_attempts
def describe_user(self):
print(f'这个用户的名字叫{self.first} {self.last.upper()}')
def greet_user(self):
print(f'Hello, {self.first} {self.last.title()}, FBI欢迎您~~~')
def increment_login_attempts(self):
self.login += 1
def reset_login_attempts(self):
self.login = 0
class Admin(User):
def __init__(self, first_name, last_name, login_attempts, privileges):
super().__init__(first_name, last_name, login_attempts)
self.privileges = Privileges(privileges)
def show_privileges(self):
self.privileges.show_privileges()
class Privileges:
def __init__(self, privileges):
self.privileges_list = privileges
def show_privileges(self):
for privilege in self.privileges_list:
print(privilege)
privileges = ["can add post", "can delete post", "can ban user"]
gao = Admin('Gao', 'Xiao', 0, privileges)
gao.show_privileges()
解释:
- 在`Admin`类中,我们初始化了`Privileges`实例,并传入了`privileges`列表。
- `Privileges`类中,我们将属性命名为`self.privileges_list`,并在方法`show_privileges`中正确地迭代显示权限。
- 创建`Admin`实例时,要传入全部必须的参数,并调用`show_privileges`方法显示权限。
这样,代码就是可运行的了。试试看!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 都没有pr 方法 某一个“天” 发表于 2024-12-14 23:07
都没有pr 方法
按照你的意见我修改了,但程序仍然报错。。。。求不吝赐教
页:
[1]