最佳实践 python 初始化检查



初始化 python 类时初始化属性和检查提供的参数的最佳方法是什么?假设__init__()中有多个参数,其中一些参数必须符合某些规则。对于其中一些,还需要有二传手和二传手。我可以从下面想到选项。你觉得怎么样?有没有更好的选择?

选项:None初始化属性并调用执行检查的 setter。

class A(object):
    def __init__(self, p1=None, ..., pn=None):
        self._p1 = None
        ...
        self._pn = None
        if p1 is not None:
            self.p1 = p1
        ...
        if pn is not None:
            self.pn = pn
    @p1.setter
    def p1(self, p1):
        # If p1 is int we can just take it
        if isinstance(p1, int):
            self._p1 = p1
        # If p1 is str we have to obtain it differently
        elif isinstance(p1, str):
            self._p1 = self._gen_some_p_from_str(p1)
        else:
            raise Exception('Incorrect p1 type provided.')
    ...
    @pn.setter
    def pn(self, pn):
        # If pn instance of SomeOtherClass it should be also great
        if isinstance(pn, SomeOtherClass):
            if pn.great():
                self._pn = pn
            else:
                raise exception('pn not great')
        # pn can be also str, and then we should get it
        elif isinstance(pn, str):
             self._pn = self._get_some_other_p_from_str(pn)
        else:
            raise Exception('Incorrect pn type provided.')

如果需要对每个分配运行验证,则属性是你的方式。

请记住,当您有许多分配(如循环中(时,这可能会产生性能问题。

您的问题可以通过仅在类启动时验证输入来解决,您最好在类上有一个cleanvalidate方法,然后在 __init__ 函数结束时调用它。

使用此方法,您可以随时调用clean方法,并省略性能比验证更重要的调用(这就是 django 表单的工作方式(。

在您的情况下,您正在尝试进行重载/调度,请查看文档

最新更新