【问题标题】:Constructor default list value构造函数默认列表值
【发布时间】:2018-03-21 20:43:52
【问题描述】:

我不确定使用默认值初始化列表的正确样式是什么。 我说的是变量 self.privileges。这是一个正确的方法吗? 谢谢

class Privileges():
    """privileges class"""
    def __init__(self):
        self.privileges = ["can add post" , "can delete post" , "can ban user"]

    def show_privileges(self):
        print(self.privileges)

【问题讨论】:

  • 是的,__init__方法就是初始化实例变量的地方。

标签: python class constructor


【解决方案1】:

定义类默认值的两个地方一般是作为类属性,或者在__init__方法中作为实例属性。

如果类的所有实例共享相同的默认值,则可以将其设为类属性

class Privileges():

    privileges = ["can add post" , "can delete post" , "can ban user"]

    def show_privileges(self):
        print(self.privileges)

如果实例之间通常会有所不同,则可以将其设为实例属性

class Privileges():

    def __init__(self):
        self.privileges = ["can add post" , "can delete post" , "can ban user"]

请注意,使用类属性并不妨碍您在某些时候添加具有相同名称的实例属性,这将覆盖默认的类属性。

class Privileges():

    privileges = ['can add post']

    def show_privileges(self):
        print(self.privileges)

    def set_better_privileges(self):
        self.privileges = ["can add post" , "can delete post" , "can ban user"]

--

>>> p = Privileges()
>>> p.show_privileges()
['can add post']
>>> p.set_better_privileges()
>>> p.show_privileges()
["can add post" , "can delete post" , "can ban user"]
>>> p2 = Privileges()
>>> p2.show_privileges()
['can add post']

使用类属性作为默认值的一个优点是它允许您读取默认值而不必先实例化该类,并且它还允许您更改该类的 所有 个实例的默认值.请注意这种行为,因为根据您的类实例如何使用和修改这些变量,您可能会无意中修改该类的 所有 实例之间共享的默认值,而不是只是为了那个例子。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-16
    • 2020-04-13
    • 2016-07-23
    • 2022-01-04
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多