如何在Python中实现Required属性

geo*_*ika 4 python

如果我有一个如下所示的类(只有更多的属性),在调用特定方法之前是否有清晰的方法来记录哪些字段是必需的?

class Example():

    def __init__(self):
        pass

    @property
    """Have to use property methods to have docstrings..."""
    def prop1(self):
        return self._prop1
    @prop1.setter
    def task(self, value):
        # validation logic..
        self._prop1 = value

    def method(self):
        # check all required properties have been added
Run Code Online (Sandbox Code Playgroud)

我可以手工编写所有必需的属性数组并在方法中循环它们,但我想知道是否有更简洁的方法,例如通过实现@requiredProperty描述符.

该类用于生成Web API的POST请求.该请求有25个以上的参数,其中一些是必需的,一些是可选的.

而不是调用请求的方法必须循环遍历数组,例如:

required_props = ['prop1','prop2',....]
Run Code Online (Sandbox Code Playgroud)

我希望在Python中有一种向属性添加所需装饰器的方法,所以我不必手动跟踪.例如

    @property, @required
    def prop1(self):
        return self._prop1
Run Code Online (Sandbox Code Playgroud)

Gar*_*err 6

在初始化对象时,确保提供所有属性不是最好的吗?然后,当您尝试访问它们时,将定义所有属性.

例如,

class Example(object):
    def __init__(self, prop1, prop2):
        self.prop1 = prop1
        self.prop2 = prop2
Run Code Online (Sandbox Code Playgroud)

此外,PEP8的说明:

对于简单的公共数据属性,最好只公开属性名称,而不使用复杂的访问器/ mutator方法.

为什么要使用属性?


Dar*_*mas 5

这应该与使用任何OO语言的方式相同:必须在构造期间设置必需的属性。调用对象方法绝不能使对象处于“不良”状态,这样method就可以在任何构造的对象上调用该方法。

如果上述内容不成立,则应考虑重构代码。

当然,总是可以通过戳破其胆量来将python对象更改为不再有效。除非有充分的理由,否则您不会这样做。不要为这件事而烦恼,因为只要您做一些愚蠢的事情,您的程序就应该浮出水面,以便您学习并停止。