初始化 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.')
如果需要对每个分配运行验证,则属性是你的方式。
请记住,当您有许多分配(如循环中(时,这可能会产生性能问题。
您的问题可以通过仅在类启动时验证输入来解决,您最好在类上有一个clean
或validate
方法,然后在 __init__
函数结束时调用它。
使用此方法,您可以随时调用clean
方法,并省略性能比验证更重要的调用(这就是 django 表单的工作方式(。
在您的情况下,您正在尝试进行重载/调度,请查看文档