coward0720 发表于 7 天前

关于实例作为类对象的代码问题

本帖最后由 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呢?

FishC 发表于 7 天前

看起来代码中有几个问题,导致了程序报错。我们来逐步解决这些问题:

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 小助理,如未能正确解答您的问题,请继续追问。

某一个“天” 发表于 7 天前

都没有pr 方法

coward0720 发表于 6 天前

某一个“天” 发表于 2024-12-14 23:07
都没有pr 方法

按照你的意见我修改了,但程序仍然报错。。。。求不吝赐教
页: [1]
查看完整版本: 关于实例作为类对象的代码问题