构造函数默认列表值

时间:2018-03-21 20:43:52

标签: python class constructor

我不确定使用默认值初始化列表的正确样式是什么。 我在谈论变量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)

1 个答案:

答案 0 :(得分: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属性并不妨碍您在某个位置添加具有相同名称的实例属性,这将覆盖默认的class属性。

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']

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