我经常看到这种模式:
class Foo:
def __init__(self, bar):
self._bar = bar
def bar(self):
return _bar
为什么这会比这更好?
class Foo:
def __init__(self, bar)
self.bar = bar
答案 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
之前会有一些处理和逻辑。也可以使用属性和描述符。不同的开发人员出于不同的原因使用不同