我有一个类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
Run Code Online (Sandbox Code Playgroud)
现在,我有许多成员_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)
Run Code Online (Sandbox Code Playgroud)
但是,我不希望用户传递除aas 之外的所有参数的值_b,_c并且_d是实现细节.我可以简单地在docstring中声明不要传递多个参数.使用下划线在"私有"属性之前是为了反映这一点.
或者,通过提供第二个私有构造函数,我可以尝试让用户更难行为:
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)
Run Code Online (Sandbox Code Playgroud)
我认为这是一个相当笨重的解决方案.
什么是解决这个问题的首选方法?还有其他更优雅的解决方案吗?这真的是一个问题; 我应该使用第一个选项并最终获得更多代码行吗?
该_下划线约定是明确的,普遍通过Python世界.
您记录了您的"公共"属性,并且只使用带有下划线的默认参数__init__.把事情简单化.
如果有人想通过使用这些私有参数搞砸一个类,你不会阻止它们,而不是Python.