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.
问题根源
- 类继承关系错误:
Privileges不应该继承Admin,权限是Admin的附属属性,而非继承关系。继承会导致Privileges被当作Admin实例初始化,需要传入Admin的全部参数,完全偏离设计初衷。 - 实例化参数缺失:
Privileges的__init__要求传入name,但Admin中实例化时未传参,直接触发TypeError。 - 冗余的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()
关键修改说明
- 调整继承关系:
Privileges改为独立类,不再继承Admin,避免不必要的实例初始化逻辑。 - 传递正确参数:
Admin实例化Privileges时,把自身的name传递给Privileges的构造函数,保证权限显示的是当前管理员的名字。 - 统一拼写:修正了
priviledges为标准拼写privileges,同时调整变量名提升可读性。 - 修正拼写错误:原代码中
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
相关产品推荐
相关产品推荐

