我有一个在实例化时采用单个参数的类,该参数a
存储在_a
属性中。对于许多方法(运算符),我还需要_b
在结果上设置一个属性。这目前以直接的方式实现:
class SomeClass(object):
def __init__(self, a=0):
self._a = a
self._b = 0
def __add__(self, other):
result = self.__class__()
result._b = self._a + other._a
return result
现在,我有许多成员_b
,例如_c
和_d
,因此__add__
每个属性都需要额外的一行。能够在对象实例化上传递这些将导致更简洁的代码:
class SomeClass(object):
def __init__(self, a=0, _b=0):
self._a = a
self._b = 0
def __add__(self, other):
return self.__class__(_b=self._a + other._a)
但是,我不希望用户传递所有参数的值,除了a
as _b
,_c
并且_d
是实现细节。我可以简单地在文档字符串中声明不要传递多个参数。在“私有”属性之前加上下划线旨在反映这一点。
或者,我可以尝试通过提供第二个私有构造函数来让用户更难行为不端:
class SomeClass(object):
def __init__(self, a=0):
self._a = a
self._init()
def _init(self, _b=0):
self._b = _b
@classmethod
def _constructor(cls, a, _b):
obj = cls(a)
obj._init(b)
return obj
def __add__(self, other):
return self.__class__._constructor(_b=self._a + other._a)
我认为这是一个相当笨拙的解决方案。
解决这个问题的首选方法是什么?还有其他更优雅的解决方案吗?这真的是个问题吗?我应该只使用第一个选项并最终得到更多代码行吗?