Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
1
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

Pythonのプライベート変数の振る舞いについて

はじめに

Pythonのプライベート変数の挙動についてメモします。

Pythonのプライベート変数

Pythonでは変数名の頭にアンダースコアを2個付けることでプライベート変数を定義できる。

employee.py
class Employee:
    def __init__(self, salary):
        self.__salary = salary

もちろんクラス内部からはアクセス可能。

employee.py
class Employee:
    def __init__(self, salary):
        self.__salary = salary

    def get_salary1(self):
        return self.__salary

    @classmethod
    def get_salary2(cls, instance):
        return instance.__salary

内部的な仕組み

プライベート変数はクラス内部で以下の形式に変換され保持されている。

_{クラス名}{プライベート変数名}

上記のEmployeeクラスだとプライベート変数はクラス内部で次の名前で保持される。

_Employee__salary

また、内部的に変換されたプライベート変数にはアクセス可能。

sample
from employee import Employee

emp = Employee(5)
print(emp.__dict__)
>>>>{'_Employee__salary': 5}

print(emp._Employee__salary)
>>>> 5

クラス継承時の挙動

クラス継承時に、親クラスのプライベート変数は内部的に"__{親クラス名}{プライベート変数名}"と扱われるため
サブクラスから単純にはアクセスできない。
(サブクラスからプライベート変数にアクセスしようとすると、内部的には"__{サブクラス名}{プライベート変数名}"と解釈されるため)

employee.py
class Employee:
    def __init__(self):
        self.__salary = 100

    def get_salary1(self):
        return self.__salary

    @classmethod
    def get_salary2(cls, instance):
        return instance.__salary


class TemporaryEmployee(Employee):
    def get_salary(self):
        return self.__salary


tmp = TemporaryEmployee()

tmp.get_salary()
>>>> AttributeError: 'TemporaryEmployee' object has no attribute '_TemporaryEmployee__salary'

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
1
Help us understand the problem. What are the problem?