假设我有一个python类,其方法对调用者没用(即它应该是私有的),但是它有一些极端情况,所以我想对它进行健全性检查(即它应该是单元测试的)
天真地,我希望我能写一个doctest:
class Thingy:
...
def __frob(self, val):
"""
>>> Thingy(...).__frob(-2)
1
"""
...
但是当我这样做时,我收到一个错误:
AttributeError: type object 'Thingy' has no attribute '__frob'
事后才有意义,但不太方便。
除了将私有方法公开之外,还有一种简单的方法可以对私有方法进行doctest吗?
答案 0 :(得分:4)
Python实际上没有私有方法。双下划线名称为mangled;他们获得了名字前面的类名(带有前导下划线)。这是因为他们的目标是帮助避免子类化时的名称冲突,而不是让他们从外部调用者私有。子类现在可以安全地定义自己的Thingy.__frob()
,并且它将与父类保持独立。
因此,您可以在测试中手动应用相同的转换:
Thingy(...)._Thingy__frob(-2)
E.g。将_ClassName
添加到方法名称的开头。
只是要明确;该功能主要是为了避免子类使用的属性之间的名称冲突。它恰好也适用于方法名称,因为方法本质上也是属性。