Python:如何为在不同类的实例中创建的类的实例传递属性值?
我输入这个标题时感到困惑,所以如果需要澄清,请告诉我。 我正在学习Eric Matthes的Python速成课程,其中一个练习提出了一个我一直无法找到答案的问题。另外,很显然,我不知道如何正确格式化下面的代码,对不起。 有关演习的守则如下:Python:如何为在不同类的实例中创建的类的实例传递属性值?,python,class,Python,Class,我输入这个标题时感到困惑,所以如果需要澄清,请告诉我。 我正在学习Eric Matthes的Python速成课程,其中一个练习提出了一个我一直无法找到答案的问题。另外,很显然,我不知道如何正确格式化下面的代码,对不起。 有关演习的守则如下: class User(): """Store info about a user profile""" def __init__(self, first_name, last_name, email, username):
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()
好的,我希望能够提供在创建Admin
实例时,在Admin
内部创建的类privileges
实例的特权列表。这些都有意义吗?每次我把它打出来,我都会感到困惑。在我看来,在一个潜在的实际应用程序中,在类定义中提供该列表是不合理的,因为它是在Admin
的\uuuu init\uuu
方法中提供的。它应该能够作为一个参数或其他东西传递给类,对吗
谢谢大家花时间读这篇文章。如果这样做没有任何意义,请告诉我。能够配置包含的对象很方便,也很有意义。它可能不会为你赢得纯度分数,它会使类纠缠在一起,但它很方便,至少有些纠缠是自然的,不一定要避免。只需添加另一个参数:
类管理员(用户):
定义初始化(自我、名字、姓氏、用户名、电子邮件、,
特权):
“”“初始化管理员的属性”“”
超级()
self.privileges=特权(privileges)
bbob=Admin('billy','bob','bbob','blah',
[“可以添加用户”、“可以阻止用户”])
或者,如果管理员
拥有一些默认权限,那么最好是让
开发人员可以选择添加它们:
类管理员(用户):
定义初始化(自我、名字、姓氏、用户名、电子邮件、,
额外特权=无):
“”“初始化管理员的属性”“”
超级()
特权=[“可以添加用户”,“可以阻止用户”]
特权+=额外特权或[]
self.privileges=特权(privileges)
bbob=Admin('billy','bob','bbob','blah')
ssara=Admin('sara','smith','ssara','blatz',['can read email']))
最后一点注意:如果可以避免的话,参数列表应该而不是包含列表之类的可变结构。微妙但重要的副作用会让他们做一些你真的没有预料到的事情。这基本上是。相反,如果默认值为空,请使用None
:
def\uuuu init\uuuu(self,privileges=None):
“”“初始化特权的属性”“”
self.privileges=特权或[]
这样,如果在没有特权的情况下调用
\uuuu init\uuu
,self.privileges
会像以前一样获取空列表。或者,如果他们提供了一份清单,那就被采纳了。但是没有令人讨厌的副作用。能够配置包含的对象非常方便,也很有意义。它可能不会为你赢得纯度分数,它会使类纠缠在一起,但它很方便,至少有些纠缠是自然的,不一定要避免。只需添加另一个参数:
类管理员(用户):
定义初始化(自我、名字、姓氏、用户名、电子邮件、,
特权):
“”“初始化管理员的属性”“”
超级()
self.privileges=特权(privileges)
bbob=Admin('billy','bob','bbob','blah',
[“可以添加用户”、“可以阻止用户”])
或者,如果管理员
拥有一些默认权限,那么最好是让
开发人员可以选择添加它们:
类管理员(用户):
定义初始化(自我、名字、姓氏、用户名、电子邮件、,
额外特权=无):
“”“初始化管理员的属性”“”
超级()
特权=[“可以添加用户”,“可以阻止用户”]
特权+=额外特权或[]
self.privileges=特权(privileges)
bbob=Admin('billy','bob','bbob','blah')
ssara=Admin('sara','smith','ssara','blatz',['can read email']))
最后一点注意:如果可以避免的话,参数列表应该而不是包含列表之类的可变结构。微妙但重要的副作用会让他们做一些你真的没有预料到的事情。这基本上是。相反,如果默认值为空,请使用None
:
def\uuuu init\uuuu(self,privileges=None):
“”“初始化特权的属性”“”
self.privileges=特权或[]
这样,如果在没有特权的情况下调用
\uuuu init\uuu
,self.privileges
会像以前一样获取空列表。或者,如果他们提供了一份清单,那就被采纳了。但是没有令人讨厌的副作用。我已经修复了代码格式,如果不正确,请告诉我。执行def\uuu init\uuuu(self,privileges=[]):
不是一个好主意。默认参数是在定义函数或方法时计算的,而不是在调用该函数或方法时计算的,因此在没有明确的特权
列表的情况下创建的每个特权
实例都将共享该默认列表。请参阅处理此问题的常用方法,即为arg提供一个默认值None
,并在函数体中执行类似于的操作(如果特权为None:privileges=[]
),这看起来更好,谢谢!另外,感谢您提供有关列表作为参数的提示。我已修复了代码格式,如果不正确,请告诉我。执行def\uuuu init\uuuuuu(self,privileges=[]):
不是一个好主意。默认参数是在定义函数或方法时计算的,而不是在定义c时