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 "<stdin>", line 1, in <module>
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 "<stdin>", line 1, in <module>
AttributeError: MyClass instance has no attribute '__myPrivateMethod'
ここではすべてが良さそうです。私たちはそれを呼び出すことができません。実は「プライベート」です。ええと、実際にはそうではありません。オブジェクトでdir()を実行すると、すべての「プライベート」メソッドに対して Python が魔法のように作成する新しい魔法のメソッドが明らかになります。
>>> dir(obj)
['_MyClass__myPrivateMethod', '__doc__', '__module__', 'myPublicMethod']
この新しいメソッドの名前は、常にアンダースコア、その後にクラス名、その後にメソッド名が続きます。
>>> obj._MyClass__myPrivateMethod()
this is private!!
カプセル化はここまでですよね?
いずれにせよ、私はいつも Python がカプセル化をサポートしていないと聞いていました。何を与える?