使用“私有”变量+方法v.s. “public”实例变量

时间:2017-06-22 19:17:30

标签: python design-patterns

我经常看到这种模式:

class Foo:
    def __init__(self, bar):
        self._bar = bar

    def bar(self):
        return _bar

为什么这会比这更好?

 class Foo:
     def __init__(self, bar)
         self.bar = bar

2 个答案:

答案 0 :(得分:0)

它将bar的外部表示与其内部表示分离。

答案 1 :(得分:0)

在您的第一个代码中,出于某些原因,这有时会更好。例如,在Python中_name只是一个命名约定,它向开发人员表明不应该从其定义的地方之外访问_name,无论是类,模块还是其他什么。此命名约定还有助于避免名称冲突,尤其是在属性在功能方面至关重要时。

让我们用真实的例子来证明。您可以在os.py模块中找到许多这样的示例,例如:

# Helper for popen() -- a proxy for a file whose close waits for the process
class _wrap_close:
    def __init__(self, stream, proc):
        self._stream = stream
        self._proc = proc
              ...

_wrap_close是您致电os.popen_proc时返回的包装类。这并不表示您不应该直接在代码中访问它,但也可能表明此属性对于类的功能至关重要,如果您查看内部,os.popen你可能会明白为什么:

# Supply os.popen()
def popen(cmd, mode="r", buffering=-1):
    # many code omitted here...
    if mode == "r":
        proc = subprocess.Popen(cmd,
                                shell=True,
                                stdout=subprocess.PIPE,
                                bufsize=buffering)
        return _wrap_close(io.TextIOWrapper(proc.stdout), proc)
  # many code omitted here... (see os.py) 

_wrap_close是围绕Popen返回的对象的包装类,实际上_wrap_close委托对self._proc进行许多操作和访问。 _wrap_close本身使用_name命名约定。

在某些情况下:

def bar(self):
    return self._bar

通常在返回self._bar之前会有一些处理和逻辑。也可以使用属性和描述符。不同的开发人员出于不同的原因使用不同

相关问题