我很困惑自己输入这个标题,所以如果需要澄清,请告诉我。 我正在通过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}}方法中一样。它应该能够作为参数传递给类,对吧?
全部,谢谢你的阅读时间。如果这根本没有任何意义,请告诉我。
答案 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
将像以前一样获取空列表。或者,如果他们提供列表,那就是采取。但没有令人讨厌的副作用。