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):

我输入这个标题时感到困惑,所以如果需要澄清,请告诉我。 我正在学习Eric Matthes的Python速成课程,其中一个练习提出了一个我一直无法找到答案的问题。另外,很显然,我不知道如何正确格式化下面的代码,对不起。 有关演习的守则如下:

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时