Pythonでは、次のように、名前の前に2つのアンダースコアを付けることで、クラス内に「プライベート」メソッドと変数を作成できます__myPrivateMethod()
。それでは、これをどのように説明できますか
>>> class MyClass:
... def myPublicMethod(self):
... print 'public method'
... def __myPrivateMethod(self):
... print 'this is private!!'
...
>>> obj = MyClass()
>>> obj.myPublicMethod()
public method
>>> obj.__myPrivateMethod()
Traceback (most recent call last):
File "", line 1, in
AttributeError: MyClass instance has no attribute '__myPrivateMethod'
>>> dir(obj)
['_MyClass__myPrivateMethod', '__doc__', '__module__', 'myPublicMethod']
>>> obj._MyClass__myPrivateMethod()
this is private!!
どうしたんだ?!
うまく理解できなかった人のためにこれを少し説明します。
>>> class MyClass:
... def myPublicMethod(self):
... print 'public method'
... def __myPrivateMethod(self):
... print 'this is private!!'
...
>>> obj = MyClass()
私が行ったことは、パブリックメソッドとプライベートメソッドでクラスを作成し、それをインスタンス化することです。
次に、そのパブリックメソッドを呼び出します。
>>> obj.myPublicMethod()
public method
次に、プライベートメソッドを呼び出します。
>>> obj.__myPrivateMethod()
Traceback (most recent call last):
File "", line 1, in
AttributeError: MyClass instance has no attribute '__myPrivateMethod'
ここではすべてが良さそうです。それを呼び出すことはできません。それは実際には「私的」です。まあ、実際にはそうではありません。オブジェクトでdir()を実行すると、Pythonがすべての「プライベート」メソッドに対して魔法のように作成する新しい魔法のメソッドが明らかになります。
>>> dir(obj)
['_MyClass__myPrivateMethod', '__doc__', '__module__', 'myPublicMethod']
この新しいメソッドの名前は常にアンダースコアであり、その後にクラス名、メソッド名が続きます。
>>> obj._MyClass__myPrivateMethod()
this is private!!
カプセル化についてはこれで十分でしょう。
いずれにせよ、Pythonはカプセル化をサポートしていないといつも聞いていました。何ができますか?