You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python类继承问题:Priviledges类无法获取Admin实例的name属性

解决Admin类中Privileges无法访问实例name属性的问题

我参考过类似技术帖子,但按方法操作后仍无法解决问题。我定义了基类User,子类Admin继承User的方法,还有一个Privileges类(注:已知拼写应为privileges,非母语疏漏)。想在Admin中实例化Privileges后,让Privileges显示Admin的name属性,但运行报错,请求帮助。

原代码:

class User:
    
    def __init__(self, name, last_name, age, city, job):
        self.name = name
        self.last_name = last_name
        self.age = age
        self.city = city
        self.job = job
        self.login_attempts = 0
    
    def describe_user(self):
        print(f"The user's name is {self.name.title()} {self.last_name.title()},\n is {self.age} years old,\n he comes from {self.city.title()},\n his job is {self.job}.")
        print(f"Welcome {self.name.title()}.\n")   

    def increment_login_attempts(self):
        self.login_attempts += 1
        print(f"Login attemps: {self.login_attempts}")
        
    def reset_login_attempts(self):
        self.login_attempts = 0
        print(f"Login attemps: {self.login_attempts}")


class Admin(User):
    def __init__(self, name, last_name, age, city, job):
        super().__init__(name, last_name, age, city, job)
   
        self.prvldgs = Priviledges()        
        

class Priviledges(Admin): 

    def __init__(self, name):
        super().__init__(name)
        
        self.priviledges = ['can add posts', 'can delete posts', 'can ban users']
        
        self.name = name
        
    def show_priviledges(self):
        print(f"{self.name} has these priviledges:\n", self.priviledges)

        
john_admin = Admin('john', 'haward', '32', 'new york', 'writer')

john_admin.prvldgs.show_priviledges()

john_admin.describe_user()

报错信息:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Input In [34], in <cell line: 52>()
     43         print(f"{self.name} has these priviledges:\n", self.priviledges)
     50 mark = User('mark', 'hamilton', '23', 'livorno', 'journalist')
---> 52 john_admin = Admin('john', 'haward', '32', 'new york', 'writer')
     55 john_admin.prvldgs.show_priviledges()
     57 john_admin.describe_user()

Input In [34], in Admin.__init__(self, name, last_name, age, city, job)
     27 def __init__(self, name, last_name, age, city, job):
     28     super().__init__(name, last_name, age, city, job)
---> 30     self.prvldgs = Priviledges()

TypeError: __init__() missing 1 required positional argument: 'name'

预期输出:

John has these privileges:
 ['can add posts', 'can delete posts', 'can ban users']
The user's name is John Haward,
 is 32 years old,
 he comes from New York,
 his job is writer.
Welcome John.

问题根源

  1. 类继承关系错误:Privileges不应该继承Admin,权限是Admin的附属属性,而非继承关系。继承会导致Privileges被当作Admin实例初始化,需要传入Admin的全部参数,完全偏离设计初衷。
  2. 实例化参数缺失:Privileges的__init__要求传入name,但Admin中实例化时未传参,直接触发TypeError。
  3. 冗余的name赋值:就算传入name,Privileges中重新赋值的self.name也和Admin实例的name无关,无法实现需求。

修正后的代码

class User:
    
    def __init__(self, name, last_name, age, city, job):
        self.name = name
        self.last_name = last_name
        self.age = age
        self.city = city
        self.job = job
        self.login_attempts = 0
    
    def describe_user(self):
        print(f"The user's name is {self.name.title()} {self.last_name.title()},\n is {self.age} years old,\n he comes from {self.city.title()},\n his job is {self.job}.")
        print(f"Welcome {self.name.title()}.\n")   

    def increment_login_attempts(self):
        self.login_attempts += 1
        print(f"Login attempts: {self.login_attempts}")
        
    def reset_login_attempts(self):
        self.login_attempts = 0
        print(f"Login attempts: {self.login_attempts}")


class Admin(User):
    def __init__(self, name, last_name, age, city, job):
        super().__init__(name, last_name, age, city, job)
        # 实例化Privileges时传入当前Admin实例的name
        self.privileges = Privileges(self.name)        
        

class Privileges: 
    # 接收用户name作为参数
    def __init__(self, username):
        self.privileges_list = ['can add posts', 'can delete posts', 'can ban users']
        self.username = username
        
    def show_privileges(self):
        print(f"{self.username.title()} has these privileges:\n", self.privileges_list)

        
john_admin = Admin('john', 'haward', '32', 'new york', 'writer')

john_admin.privileges.show_privileges()

john_admin.describe_user()

关键修改说明

  1. 调整继承关系:Privileges改为独立类,不再继承Admin,避免不必要的实例初始化逻辑。
  2. 传递正确参数:Admin实例化Privileges时,把自身的name传递给Privileges的构造函数,保证权限显示的是当前管理员的名字。
  3. 统一拼写:修正了priviledges为标准拼写privileges,同时调整变量名提升可读性。
  4. 修正拼写错误:原代码中Login attemps改为Login attempts,符合英语拼写规范。

运行结果

John has these privileges:
 ['can add posts', 'can delete posts', 'can ban users']
The user's name is John Haward,
 is 32 years old,
 he comes from New York,
 his job is writer.
Welcome John.

内容的提问来源于stack exchange,提问作者RandomDude

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 04:25:20