访问 class 中的属性

Accessing Attributes in a class

我是试图理解 OOP 概念的编码新手。最近我遇到了一段代码,并努力理解一些行

class User():
    """Represent a simple user profile."""

    def __init__(self, first_name, last_name, username, email, location):
        """Initialize the user."""
        self.first_name = first_name.title()
        self.last_name = last_name.title()
        self.username = username
        self.email = email
        self.location = location.title()
        self.login_attempts = 0

    def describe_user(self):
        """Display a summary of the user's information."""
        print("\n" + self.first_name + " " + self.last_name)
        print("  Username: " + self.username)
        print("  Email: " + self.email)
        print("  Location: " + self.location)

    def greet_user(self):
        """Display a personalized greeting to the user."""
        print("\nWelcome back, " + self.username + "!")

    def increment_login_attempts(self):
        """Increment the value of login_attempts."""
        self.login_attempts += 1

    def reset_login_attempts(self):
        """Reset login_attempts to 0."""
        self.login_attempts = 0


class Admin(User):
        """A user with administrative privileges."""
    
        def __init__(self, first_name, last_name, username, email, location):
            """Initialize the admin."""
            super().__init__(first_name, last_name, username, email, location)
    
            # Initialize an empty set of privileges.
            self.privileges = Privileges()
    
class Privileges():
        """A class to store an admin's privileges."""
    
        def __init__(self, privileges=[]):
            self.privileges = privileges
    
        def show_privileges(self):
            print("\nPrivileges:")
            if self.privileges:
                for privilege in self.privileges:
                    print("- " + privilege)
            else:
                print("- This user has no privileges.")
    
    
    eric = Admin('eric', 'matthes', 'e_matthes', 'e_matthes@example.com', 'alaska')
    eric.describe_user()
    
    eric.privileges.show_privileges()
    
    print("\nAdding privileges...")
    eric_privileges = [
        'can reset passwords',
        'can moderate discussions',
        'can suspend accounts',
        ]
    eric.privileges.privileges = eric_privileges
    eric.privileges.show_privileges()

下面这行看起来很混乱。如果您能提出更好的编码方式,我欢迎您提供反馈

  eric.privileges.privileges = eric_privileges

非常感谢您对此的看法。非常感谢

关于行 eric.privileges.privileges = eric_privileges...

class Privileges 和一个名为 privileges 的 class 变量似乎确实令人困惑。这可能暗示 class 并不是真正需要的。那么一种可能性是:

1.删除 class Privileges

如果特权是特定于管理员的 - 即假设代码的其他部分不再使用特权功能 - 为什么不使用列表来存储所有特权? show_privileges() 方法可以移至 Admin class 或成为一个独立的函数。第二种选择 - 以及通常适度使用 classes - 通常会导致代码更易于维护和测试。

class Admin(User):    
    def __init__(self, first_name, last_name, username, email, location):
        super().__init__(first_name, last_name, username, email, location)
        self.privileges = []

def show_privileges(privileges):
    print("\nPrivileges:")
    if privileges:
        for privilege in privileges:
            print("- " + privilege)
        else:
            print("- This user has no privileges.")


eric = Admin('eric', 'matthes', 'e_matthes', 'e_matthes@example.com', 'alaska')
eric.describe_user()
print_privileges(eric.privileges)

print("\nAdding privileges...")
eric_privileges = [
    'can reset passwords',
    'can moderate discussions',
    'can suspend accounts',
    ]
eric.privileges = eric_privileges
show_privileges(eric.privileges)

也许将特权存储在单独的文件中确实有意义 class(例如,它应该存储更多变量并提供更多功能)。在这种情况下,当前名称可能不是表示 class 的最佳选项。所以另一种可能是:

2。重命名 class Privileges

如果 class Privileges 是必需的,也许重命名它会有助于澄清事情。例如,称它为 PrivilegeHandler(或在上下文中合适的其他名称)将导致:

class Admin(User):    
    def __init__(self, first_name, last_name, username, email, location):
        super().__init__(first_name, last_name, username, email, location)
        self.privilege_handler = PrivilegeHandler()

class PrivilegeHandler:

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

    def add_privileges(self, new_privileges):
        self.privileges.extend(new_privileges)

    def show_privileges(self):
        print("\nPrivileges:")
        # ...

# ...
eric.privilege_handler.add_privileges(eric_privileges)
eric.privilege_handler.show_privileges()