__init__( ) 缺少 1 个要求位置参数

__init__( ) missing 1 requirement positional argument

我想问一个与Python'class'相关的问题,因为我在这个网站上练习练习9.8时卡在了这个例子上: https://ehmatthes.github.io/pcc_2e/solutions/chapter_9/#9-9-battery-upgrade

示例写一个单独的权限class。 class 应该有一个属性 privileges,它存储一个字符串列表,如练习 9-7 中所述。将 show_privileges() 方法移动到此 class。在 Admin class 中创建一个 Privileges 实例作为属性。创建一个新的 Admin 实例并使用您的方法显示其权限。

#Seperate Privileges Class from Admin Class
#This is parent class
class User:
    def __init__(person, first_name, last_name, age, location, mail):
        person.first_name = first_name
        person.last_name = last_name
        person.age = age
        person.location = location
        person.mail = mail
        person.login_attempts = 0
    def describe_user(person):
        print(f"User full name: {person.first_name} {person.last_name}")
        print(f"User age: {person.age}")
        print(f"User location: {person.location}")
        print(f"User mail: {person.mail}")
    def greet_user(person):
        print(f"Hello {person.first_name} {person.last_name}!")
    def increment_login_attempts(person):
        person.login_attempts += 1
        
    def reset_login_attempts(person):
        person.login_attempts = 0
        
#This is child class Admin
class Admin(User):
    def __init__(self, first_name, last_name, age, location, mail): 
        super().__init__(first_name, last_name, age, location, mail)
        '''Initialize an empty set of privileges'''
        self.privileges = Privileges()    
#Seperate Privileges class: 
class Privileges:
    def __init__(self, privilege): (1)
        self.privileges = [] (2)
        
    def show_privileges(self):
        print("\nAdministrator's privileges are:")
        for privilege in self.privileges:
            print(f"- {privilege}")
    
Tom = Admin('Tom', 'Felton', 23, "the UK", 'tomfelton@hotmail.com')
Tom.describe_user()
Tom.privileges.privileges = ["can add post", "can delete post", "can ban user", "can do bla bla"]
Tom.privileges.show_privileges()

执行完上面的全部代码后,我得到了这个错误:

我已经检查了上面同一站点的答案,但是我很难理解为什么我要把我的代码的第 (1) 行和第 (2) 行更改为这一行:

def __init__(self, privileges=[]): (1)
        self.privileges = privileges  (2)

本站给出的答案是错误的。

如果您想要一个可选的权限列表,您需要一个默认参数值。请注意,因为 [] 是一个可变值,所以您需要使用类似 None 的东西,并在函数内用一个新的空列表替换它。

class Privileges:
    def __init__(self, privileges=None):
        self.privileges = [] if privileges is None else privileges

在签名中使用默认值 [] 意味着使用默认值创建的每个 Privileges 实例将共享 相同的 权限列表: 对一个实例权限的更改将在其他实例中可见。