Pythonプライベート属性(private attributes)とその呼び出し
1696 ワード
Pythonのプライベート属性
オブジェクト向け(Object Oriented Design)のシナリオでは、プライベートメソッドとプライベート変数を含むプライベート属性(private attributes)とは、1つのクラスまたはインスタンス内でのみ使用できるメソッドと変数を指す.これらのメソッドおよび変数は、クラスおよびインスタンスの外部で呼び出されるべきではありません.しかしながら、Pythonの設計では、クラスまたはインスタンス属性への真のアクセス制限はありません(例えば、Javaのキーワード
オブジェクト向け設計では非常に有用な抽象モードであるため,Pythonでは名目上のプライベート属性定義仕様が提供される.一般に、クラス定義における2つの下線(例えば
Pythonでは、この約束は一般的にエラーを回避するためのメソッド呼び出しにすぎないが、外部から呼び出されるこれらの「プライベート」とみなされる属性を完全に阻止することはできない.次の例では、この現象を説明します.
プライベート属性のユニットテスト
多くの場合、二重下線を接頭辞とする属性を「プライベート」属性として定義していますが、セルテストを行う際には、これらのプライベート属性をテストしたりmockしたりする必要があります.では、これらのプロパティやmockなどのプロパティを呼び出すには、改編された名前を使用することに注意します.
Reference https://docs.python.org/3.5/tutorial/classes.html#private-variables
オブジェクト向け(Object Oriented Design)のシナリオでは、プライベートメソッドとプライベート変数を含むプライベート属性(private attributes)とは、1つのクラスまたはインスタンス内でのみ使用できるメソッドと変数を指す.これらのメソッドおよび変数は、クラスおよびインスタンスの外部で呼び出されるべきではありません.しかしながら、Pythonの設計では、クラスまたはインスタンス属性への真のアクセス制限はありません(例えば、Javaのキーワード
private
のような).オブジェクト向け設計では非常に有用な抽象モードであるため,Pythonでは名目上のプライベート属性定義仕様が提供される.一般に、クラス定義における2つの下線(例えば
__func()
)で始まる方法または変数は、プライベート属性とみなされる.このようなフォーマットで定義される方法または変数は、一般にクラスのみの内部呼び出しであるべきである.このようなフォーマットで定義されたプライベート属性に対してpythonは強制的なアクセス制限ではなく、いわゆる名前改編(name mangling)を採用している.名前の改編とは、Pythonがクラスで定義した少なくとも2つの下線で始まる属性(メソッドと変数を含む)の名前を_ __
のフォーマットに改編することを意味します.例えば、__func()
については、_classname__func()
に改編される.注意:クラス名に含まれる接頭辞の下線はすべて無視されます.クラスに上記のフォーマットを複合するプロパティが定義されている限り、そのプロパティがメソッドであっても変数であっても、この名前を改編するプロセスは常に発生します.また、名前の改編により、子クラスが親クラスを再ロードする方法で名前の競合を回避することもできます.Pythonでは、この約束は一般的にエラーを回避するためのメソッド呼び出しにすぎないが、外部から呼び出されるこれらの「プライベート」とみなされる属性を完全に阻止することはできない.次の例では、この現象を説明します.
class foo(object):
def __init__(self):
self.__var = 1
def __bar(self):
print('bar')
f = foo()
hasattr(f, '__bar') # False
hasattr(f, '_foo__bar') #True
hasattr(f, '__var') # False
hasattr(f, '_foo__var') # True
f.__bar() # AttributeError: 'foo' object has no attribute '__bar'
f._foo__bar() # will print out 'bar'
f._foo_var # 1
プライベート属性のユニットテスト
多くの場合、二重下線を接頭辞とする属性を「プライベート」属性として定義していますが、セルテストを行う際には、これらのプライベート属性をテストしたりmockしたりする必要があります.では、これらのプロパティやmockなどのプロパティを呼び出すには、改編された名前を使用することに注意します.
Reference https://docs.python.org/3.5/tutorial/classes.html#private-variables