Python:如何为在不同类的实例中创建的类的实例传递属性值?

时间:2017-07-21 02:39:50

标签: python class

我很困惑自己输入这个标题,所以如果需要澄清,请告诉我。 我正在通过Python Matshhes的Python Crash Course工作,其中一个练习提出了一个我无法找到答案的问题。另外,显然,我无法弄清楚如何正确格式化以下代码,抱歉。 有关练习的代码如下:

class User():
    """Store info about a user profile"""

    def __init__(self, first_name, last_name, email, username):
        """Init common profile info"""
        self.first_name = first_name
        self.last_name = last_name
        self.email = email
        self.username = username
        self.login_attempts = 0

    def describe_user(self):
        """Print users info"""
        print("User info summary: \n\t" + 
            self.first_name.title() + " " +
            self.last_name.title() + "\n\t" +
            self.username + "\n\t" +
            self.email
            )

    def greet_user(self):
        """Print a short greeting"""
        print("Welcome, " + self.first_name.title() + "!")

    def increment_login_attempts(self):
        """Increments the number of login attempts by 1"""
        self.login_attempts += 1

    def reset_login_attempts(self):
        """Rest value of login_attempts to 0"""
        self.login_attempts = 0

class Privileges():
    """Represents a list of privileges"""

    def __init__(self, privileges=[]):
        """Initialize attributes for Privileges"""
        self.privileges = privileges

    def show_privileges(self):
        """Print the list of privileges for this admin"""
        for item in self.privileges:
            print(item.title())

class Admin(User):
    """Model an administrative user"""

    def __init__(self, first_name, last_name, username, email):
        """Initialize attributes of Admin"""
        super().__init__(first_name, last_name, username, email)
        self.privileges = Privileges(['can add user', 'can block user'])

bbob = Admin('billy', 'bob', 'bbob', 'blah')
bbob.privileges.show_privileges()

好的,我希望能够为Privileges内创建的Admin类实例提供特权列表,当时我和#39; m创建Admin的实例。这一切都有意义吗?每次我输入它都会让我感到困惑。在我看来,在潜在的实际应用程序中,在类定义中提供该列表是不合理的,就像在Admin的{​​{1}}方法中一样。它应该能够作为参数传递给类,对吧?

全部,谢谢你的阅读时间。如果这根本没有任何意义,请告诉我。

1 个答案:

答案 0 :(得分:2)

能够配置包含对象是方便且有意义的。它可能不会赢得你的纯度点,它会使课程陷入困境,但它很方便,至少有些纠缠是自然的,不一定要避免。只需添加另一个参数:

class Admin(User):

     def __init__(self, first_name, last_name, username, email,
                  privileges):
         """Initialize attributes of Admin"""
         super().__init__(first_name, last_name, username, email)
         self.privileges = Privileges(privileges)

 bbob = Admin('billy', 'bob', 'bbob', 'blah',
              ['can add user', 'can block user'])

或者,或许更好,如果Admins有一些默认权限,只是为了让 开发人员可选择添加它们:

class Admin(User):

     def __init__(self, first_name, last_name, username, email,
                  extra_privileges=None):
         """Initialize attributes of Admin"""
         super().__init__(first_name, last_name, username, email)
         privileges = ['can add user', 'can block user']
         privileges += extra_privileges or []
         self.privileges = Privileges(privileges)

 bbob = Admin('billy', 'bob', 'bbob', 'blah')
 ssara = Admin('sara', 'smith', 'ssara', 'blatz', ['can read emails'])

最后一点说明:参数列表应包含可变结构,如列表,如果你可以完全避免。微妙但重要的副作用可以使他们做你真正不期望的事情。这基本上是Python gotcha #1。相反,如果您的默认值为null,请使用None

 def __init__(self, privileges=None):
     """Initialize attributes for Privileges"""
     self.privileges = privileges or []

这样,如果在没有权限的情况下调用__init__self.privileges将像以前一样获取空列表。或者,如果他们提供列表,那就是采取。但没有令人讨厌的副作用。