スポンサーリンク

コードが書ける!数式が書ける!AAが書ける!スタンプが貼れる!

無料の匿名掲示板型SNS「このはちゃんねる

新規会員募集中!

【Python】クラスのプライベート変数の書き方。戦乱の世から臣下を守る【入門第34回】

132, 2019-08-26

目次

イントロダクション

時は戦国、人々は戦火の中にその身を晒していた。
強者が弱者を刈り取る無慈悲な時代、それは弱肉強食を体現していた。
クラス城の城主、__init___公は城中の使用人(インスタンス変数)の身を案じていた。
「戦乱の世、女子供が生きていくにはこの世は辛すぎる」
「何か、インスタンス変数らを保護するための何かが必要じゃ……」
時の武将、__init__公は苦慮の結果、プライベート変数を発明。
それは城中のインスタンス変数らを保護し、見事__init__公は戦乱の世で城を守り切ったのであった――。

クラスのプライベート変数とは?

こんにちは、narupoです。

今回はクラスのプライベート変数をやります。
プライベート変数は、インスタンス変数を保護する仕組みです。
このプライベート変数を使えるようになれば、ひとつ品質の高いクラスを設計することができるかもしれません。

プライベートなことなんで……あんまり詮索しないでください……

プライベート変数の必要性

まず普通のインスタンス変数を見てみましょう。

class Cat:
    def __init__(self):
        self.name = 'ミケ'

↑の場合、self.nameというのがインスタンス変数でした。
このインスタンス変数nameは外から自由に変更できます。
たとえば↓のようにです。

cat = Cat()
cat.name = 'タマ'

しかし、クラスの設計上、インスタンス変数をむやみに変えてほしくないケースがあります。
そのとき、勝手にインスタンス変数の値を変更されると、意図したとおりにプログラムが動かないなどの事態が発生します。
これを防ぐには、インスタンス変数を外から変更できないようにするのが合理的です。
そのための仕組みがプライベート変数です

プライベート変数の書き方

先ほどのインスタンス変数nameをプライベート変数に変えてみましょう。
インスタンス変数をプライベート変数にするには↓のように変数にアンダーバー(_)を2つ付けます。

class Cat:
    def __init__(self):
        self.__name = 'ミケ'

↑のようにself.__nameにすることで、変数をプライベート変数にすることが出来ました。
↓のように変数にアクセスすると、

cat = Cat()
print(cat.__name)

↓のようなエラーになります。

AttributeError: 'Cat' object has no attribute '__name'

Catオブジェクトは__name属性を持っていない、というエラーですね。
このようにアンダーバー(_)を2つ付けてプライベート変数にすることで、変数を保護することができます。

プライベート変数の正体

じつは、Pythonには変数を保護する仕組みがありません
さきほどのプライベート変数の挙動と矛盾しているようですが、これは事実です。
Pythonのプライベート変数というのは、約束事の中での保護であって、その約束を破れば保護を無効化することができます。
いったいどういうことでしょうか?

Pythonはアンダーバー2つを付けた変数をどのようにプライベート変数にしているのか。
これは簡単で、変数の名前を変えているだけです
たとえばCatクラスの__nameというプライベート変数は、_Cat__nameという変数名にマングル(難号化)されます。
なので、↓のように変数にアクセスしても変数は存在しませんが、

print(cat.__name)

↓のようにマングル化した変数名でアクセスすると、参照できてしまいます。

print(cat._Cat__name)

もちろん、値を変更することも可能です。

cat._Cat__name = 'タマ'

このように、Pythonでは完璧に変数を保護する機能はありません。
つまり、われわれは約束の中で変数を保護する必要があるのです。

「これ、プライベート変数にしとくから、かってに値変えないでぴょん」
「わかったぴょん」

そういった紳士協定を結ぶわけです
これは紳士同士の協定です。
この協定を破ったものは烈火の中で焼かれもだえ苦しみ、子々孫々にわたるまで呪われることでしょう

おわりに

プライベート変数の仕組みは、堅牢なクラスの設計で必要不可欠なものです。
Pythonはその辺ゆるい言語ですが、みなさんも大人になって約束を守りましょう

以上、次回に続きます。

また見てぴょん

関連動画



投稿者名です。64字以内で入力してください。

必要な場合はEメールアドレスを入力してください(全体に公開されます)。

投稿する内容です。

スポンサーリンク

スポンサーリンク

スポンサーリンク

スポンサーリンク