クラスにおけるプライベート変数
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
クラスは以下のメソッドを持つ必要があります:
insert(name, value)
: このメソッドは、新しいname: value
ペアをデータベースに挿入します。もしname
がすでにデータベースに存在する場合、Name already exists in the database.
というメッセージを表示します。delete(name)
: このメソッドは、既存のname: value
ペアをデータベースから削除します。もしname
が存在しない場合、Name does not exist in the database.
というメッセージを表示します。update(name, value)
: このメソッドは、データベース内の既存のname
のvalue
を更新します。もしname
が存在しない場合、Name does not exist in the database.
というメッセージを表示します。display()
: このメソッドは、データベース内のすべてのname: value
ペアをname: value
の形式で表示します。すべての値はカンマとスペース(,
)で区切ります。
入力 | 出力 |
| Bob: 24, Alice: 25 Bob: 24 |
Constraints
Time limit: 2 seconds
Memory limit: 512 MB
Output limit: 1 MB