Pythonでクラス内にPrivate変数を作成する方法

記事内に広告が含まれています。

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変数を作成する方法でした。

タイトルとURLをコピーしました