鱼C论坛

 找回密码
 立即注册
查看: 71|回复: 3

[已解决]关于实例作为类对象的代码问题

[复制链接]
发表于 2024-12-14 22:59:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 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呢?
最佳答案
2024-12-14 23:04:23
看起来代码中有几个问题,导致了程序报错。我们来逐步解决这些问题:

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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-12-14 23:04:23 | 显示全部楼层    本楼为最佳答案   
看起来代码中有几个问题,导致了程序报错。我们来逐步解决这些问题:

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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-12-14 23:07:49 | 显示全部楼层
都没有pr 方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-12-15 10:22:09 | 显示全部楼层

按照你的意见我修改了,但程序仍然报错。。。。求不吝赐教
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-24 05:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表