我对在Python中为实例方法返回值的推荐方法感到好奇。我很抱歉,如果这是一个相当微不足道的问题,但我似乎无法在google / sx /上找到合适的答案。
选项1:
class Cla:
def __init__(self):
self.var = False
def _inst_mtd(self):
var = True
return var
def calc_var(self):
self.var = self._inst_mtd() # or in init if desired
def return_var(self):
return self.var
选项2:
class Cla:
def __init__(self):
self.var = False
def _inst_mtd(self):
self.var = True
def calc_var(self):
self._inst_mtd()
def return_var(self):
return self.var
选项3:
class Cla:
def __init__(self):
self.var = False
def _inst_mtd(self):
self.var = True
return self.var
def calc_var(self):
self.var = self._inst_mtd()
def return_var(self):
return self.var
_inst_mtd
的意图是计算self.var
的值。返回self.var
的单独公共方法将向外部调用者提供return
函数。 _inst_mtd
意味着在类中调用,可能在循环中调用,并且可能使用公共方法calc_var
,例如,它需要一段时间才能运行。
我担心的是,如果_inst_mtd
的整个要点是修改self.var
并且实际上没有处理另一个名为var
的变量,那么1可能会导致局部变量和实例变量混淆。对于2,我的印象是(仅考虑_inst_mtd
)这构成副作用,应该避免吗?但是3似乎没必要,虽然它确实适用于返回类型注释,尤其是在_inst_mtd
中更改了类型(不推荐)或其中的元素时。
答案 0 :(得分:2)
您过分强调公共/私人访问。在Python中,任何实例(方法,变量等)的每个成员都是公开可用的。所以,你甚至不愿意写特别的getter
或setters
。代替:
c = Cla()
c.var = 42
print(c.var)
完全可以接受。如果你仍然希望提示给其他程序员这个变量应该是私有的而不是搞乱的,你通常会在它前面添加一个下划线:self._var
。但是,这只是一个惯例。有关更多信息,请参阅https://stackoverflow.com/a/1301369/1269892
答案 1 :(得分:2)
在这三个中,我认为选项2最有意义,因为每个方法的作用都很明确。但是如果_inst_mtd
真的不需要内部状态,就像在选项1中一样,那么你应该只是让它成为类之外的函数。在Python中,使用getter以防万一有一天你需要它们通常被认为是错误的方式,因为它在大多数时候是一个多余的复杂功能。此外,如果需要,您始终可以从公共方法中提取内部使用的方法。您可以保留它的简单性通常比为假设的未来需求而设计更有价值。
class Cla:
def __init__(self):
self.var = False
def calc_var(self):
self.var = True
instance = Cla()
instance.calc_var()
value = instance.var