クラスにおけるプライベート変数

Pythonのクラスを使うと、関連するデータや関数をまとめてカプセル化し、コードを整理できます。場合によっては、クラスの外部から変数を使われたくないことがあります。Pythonでは、プライベート変数をクラス内で定義して、コードのユーザーがそれらの変数にアクセスできないようにすることができます。プライベート変数は、変数名の先頭にアンダースコアを2つ(__)付けて定義します。パブリック変数はクラスの外部から直接アクセスできますが、プライベート変数はそうではありません。例を見てみましょう:
class PublicPrivateExample:
    def __init__(self):
        self.public_var = 'I am public!'      # パブリック変数
        self.__private_var = 'I am private!'  # プライベート変数

example = PublicPrivateExample()
print(example.public_var)                     # 'I am public!'
print(example.__private_var)                  # AttributeErrorが発生
この場合、パブリック変数は簡単にアクセスできます。しかし、プライベート変数にアクセスしようとすると、PythonはAttributeErrorを発生させます。
Pythonには、JavaやC++のような厳密なプライベートメンバーはありません。Pythonでは、プライベートメンバーは直接アクセスしないようにという慣習です。Pythonはネームマングリングを使用して、プライベート変数に誤ってアクセス・変更する可能性を低くしています。しかし、必要であればアクセスすることもできますが、一般的には避けるべきです:
print(example._PublicPrivateExample__private_var)  # I am private!
プライベート変数へのアクセスは、_クラス名__変数名を使って行います。これにより、直接のアクセスを控え、カプセル化を促進します。プライベート変数にアクセスする必要がある場合は、パブリックなメソッドを提供すると良いでしょう:
class PublicPrivateExample:
    def __init__(self):
        self.__private_var = 'I am private!'

    def get_private_var(self):      # プライベート変数へのゲッターメソッド
        return self.__private_var   # クラス内ではプライベート変数にアクセス可能

example = PublicPrivateExample()
print(example.get_private_var())    # 'I am private!'を出力
ここでは、パブリックなメソッドget_private_varを使って、プライベート変数への制御されたアクセス方法を提供しています。これにより、データのカプセル化と整合性を維持できます。
💭
覚えておきたいポイント

チャレンジ:データベースクラス

あなたは、name: valueのペアを保存するPythonのDatabaseクラスを開発するよう求められています。このデータベースは、Databaseクラス内のプライベートな辞書として表現されるべきです。
Databaseクラスは以下のメソッドを持つ必要があります:
  1. insert(name, value): このメソッドは、新しいname: valueペアをデータベースに挿入します。もしnameがすでにデータベースに存在する場合、Name already exists in the database.というメッセージを表示します。
  1. delete(name): このメソッドは、既存のname: valueペアをデータベースから削除します。もしnameが存在しない場合、Name does not exist in the database.というメッセージを表示します。
  1. update(name, value): このメソッドは、データベース内の既存のnamevalueを更新します。もしnameが存在しない場合、Name does not exist in the database.というメッセージを表示します。
  1. display(): このメソッドは、データベース内のすべてのname: valueペアをname: valueの形式で表示します。すべての値はカンマとスペース(, )で区切ります。
入力
出力
db = Database(); db.insert('Bob', 23); db.insert('Alice', 25); db.update('Bob', 24); db.display(); db.delete('Alice'); db.display();
Bob: 24, Alice: 25 Bob: 24
 

Constraints

Time limit: 1 seconds

Memory limit: 512 MB

Output limit: 1 MB

To check your solution you need to sign in
Sign in to continue