Pythonには他のオブジェクト指向言語(C++やJavaなど)にあるクラス内の変数を明確にPrivateにする方法はありません。
ただ、疑似的にPrivate変数を確保することはできます。
ただし注意して利用しないと思わない動作結果を招く可能性があります。
Pythonでクラス内にPrivate変数を作成する
Pythonには他のオブジェクト指向言語(C++やJavaなど)のように「private」のようなキーワードはありません。
では、クラス内に「private」な変数が持てないかということ、そうではなくて疑似的には持てるようになっています。
その方法は「private」にしたい変数を「__(アンダーバー2つ)」を名前の前につけて宣言すると可能になります。
class myClass :
def __init__( self ) :
self.__name = 'Taro'
このように「__」を先頭につけるとprivate変数のような扱いになります。
具体的には「__」が付いた変数をインスタンスから直接呼ぶことができなくなります。
class myClass :
def __init__( self ) :
self.__name = 'Taro'
c1 = myClass()
print( 'c1.__name------------->' + c1.__name )
上記のプログラムを実行すると
Traceback (most recent call last):
File "main1.py", line 7, in <module>
print( 'c1.__name------------->' + c1.__name )
AttributeError: 'myClass' object has no attribute '__name'
変数としては「__name」が宣言されていそうですが、存在しない属性としてエラーになります。
ちなみに「__」でない変数にすると正常に表示されます。
class myClass :
def __init__( self ) :
self.name = 'Taro'
c1 = myClass()
print( 'c1.name------------->' + c1.name )
c1.name------------->Taro
なので「__」が付いた変数は外部から操作できないので、setterやgetterを用意してアクセスしてやることになります。
lass myClass :
def __init__( self ) :
self.__name = 'Taro'
self.name = 'Hanako'
def getPrivateName( self ) :
return self.__name
def getName( self ) :
return self.name
c1 = myClass()
c2 = myClass()
c1.__name = 'Jiro'
print('***c1.__name = Jiro***')
print( 'c1.__name------------->' + c1.__name )
print( 'c1.getPrivateName()--->' + c1.getPrivateName() )
print('***')
print( 'c1.name--------------->' + c1.name )
print( 'c1.getName()---------->' + c1.getName() )
c1.name = 'Yoshie'
print('***c1.name = Yoshie***')
print( 'c1.__name------------->' + c1.__name )
print( 'c1.getPrivateName()--->' + c1.getPrivateName() )
print('***')
print( 'c1.name--------------->' + c1.name )
print( 'c1.getName()---------->' + c1.getName() )
このプログラムを実行すると
***c1.__name = Jiro*** c1.__name------------->Jiro c1.getPrivateName()--->Taro *** c1.name--------------->Hanako c1.getName()---------->Hanako ***c1.name = Yoshie*** c1.__name------------->Jiro c1.getPrivateName()--->Taro *** c1.name--------------->Yoshie c1.getName()---------->Yoshie
になり、当然ですが「__」ありとなしとでは別の変数として確保されています。
上記の内容で注意点は
になっているということです。
ここを混乱させると思わぬ不具合を招く恐れがあるので注意しましょう。
ちなみに上記のプログラムで
print( 'c2.__name------------->' + c2.__name )
という文を最後に実行すると当然
Traceback (most recent call last):
File "main.py", line 32, in <module>
print( 'c2.__name------------->' + c2.__name )
AttributeError: 'myClass' object has no attribute '__name'
というエラーになります。
まとめ
Pythonではクラス内に「__(アンダーバー2つ)」を付加した変数を宣言することによって疑似的にPrivate変数を作成することができます。
ただし、
には要注意で扱うことが大切です。
以上、Pythonでクラス内にPrivate変数を作成する方法でした。
