如何为类的实例定义默认属性列表?

Ada*_*erg 6 python attributes properties

我的程序中有一些对象,每个对象大约有10-15个属性.这些属性在程序的各个阶段设置在代码中的不同位置.因为在没有在Python的类中定义它们的情况下将它们设置在对象上是绝对正确的,所以在我的程序中没有使用哪些属性的良好权威列表.

我喜欢以下内容:

class MyObject(object):
    attr1
    attr2
Run Code Online (Sandbox Code Playgroud)

我看过property()内置的,但每个属性至少有6行代码.有没有一种简单的方法来定义默认属性列表而无需在Python中初始化它们?

更新:我忘了提及,大多数值没有合理的默认值,并且None在使用之前实际上等于.

mar*_*eau 9

我认为Hugh Bothwell走在正确的轨道上,但它可以更简洁地完成:

class MyClass(object):
    _defaults = "attr1", "attr2", "attr3"
    _default_value = None

    def __init__(self, **kwargs):
        self.__dict__.update(dict.fromkeys(self._defaults, self._default_value))
        self.__dict__.update(kwargs)


my_object = MyClass(attr3='overridden', attr4='added')

print(vars(my_object))
Run Code Online (Sandbox Code Playgroud)

输出:

{'attr4': 'added', 'attr2': None, 'attr3': 'overridden', 'attr1': None}
Run Code Online (Sandbox Code Playgroud)

我做了_defaults_default_value类属性(可以在运行时改变).(但是,提供可变的默认值可能需要额外的代码来防止它被创建的每个实例共享.)

这很容易扩展,以允许为每个默认属性定义不同的(不可变的)默认值:

class MyClass(object):
    _defaults = {
        "attr1": None,
        "attr2": 0,
        "attr3": ""
    }

    def __init__(self, **kwargs):
        self.__dict__.update(self._defaults)
        self.__dict__.update(kwargs)


my_object = MyClass(attr3='overridden', attr4='added')

print(vars(my_object))
Run Code Online (Sandbox Code Playgroud)

输出:

{'attr4': 'added', 'attr2': 0, 'attr3': 'overridden', 'attr1': None}
Run Code Online (Sandbox Code Playgroud)


Jun*_*uxx 6

像这样?

class MyObject(object):
    def __init__(self, attr1 = default1, attr2 = default2):
        self.attr1 = attr1
        self.attr2 = attr2
Run Code Online (Sandbox Code Playgroud)

您可以MyObject使用或不指定属性来实例化a

myObject1 = MyObject() # gets default values 
myObject2 = MyObject(foo, bar) # overrides defaults
Run Code Online (Sandbox Code Playgroud)

kwargs如果您有可变数量的属性,也可以使用关键字arguments(),请参阅此处以获取示例.