在实例方法中返回值的最佳方法

时间:2018-01-26 16:17:53

标签: python coding-style python-3.5

我对在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中更改了类型(不推荐)或其中的元素时。

2 个答案:

答案 0 :(得分:2)

您过分强调公共/私人访问。在Python中,任何实例(方法,变量等)的每个成员都是公开可用的。所以,你甚至不愿意写特别的gettersetters。代替:

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