クラスにおけるプライベート変数
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
の形式で表示します。すべての値はカンマとスペース(,
)で区切ります。
入力 | 出力 |
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