Pythonのクラスにはメンバ変数のアクセス制限という概念がありません。全ての変数がpublicとして扱われます。しかし、疑似private変数を作ることができます。
class BaseClass(object):
def __init__(self):
self.__param = "I'm BaseClass"
このように、メンバ変数の名前の頭にアンダースコアを二つつけると、疑似的にprivate変数を作ることができます。しかし、これをクラス継承と併用しようとすると問題が生じます。
class ChildClass(BaseClass):
def hello(self):
print self.__param
ChildClass().hello() # AttributeError: 'ChildClass' object has no attribute '_ChildClass__param'
このように、親クラス内のメソッドで設定した疑似private変数に、子クラスの内部からアクセスしようとすると失敗します。
解決策としては、親クラス内で一緒にゲッタを宣言しておく方法があります。
class BaseClass(object):
def __init__(self):
self.__param = "I'm BaseClass"
def get_param(self):
return self.__param
class ChildClass(BaseClass):
def hello(self):
print self.get_param()
print(ChildClass().hello()) # "I'm BaseClass"
このように、親クラスのプロパティにすることで、外部からの直接のセットを防ぐことができます。
以上がPythonのクラス継承とプライベート変数についての基本的な説明です。これらの概念を理解することで、より効率的なコードを書くことができます。.