2023/09/23 (土) revised done
以下のコードはクラスの基本構造で用いたクラスのコードに手を加えたものである。昨今、個人情報保護には厳しい世の中になっている。そこで、ユーザーの名前の一部を隠すことを考えた。ここではクラスの継承を利用している。コードの終わりに解説を加えている。
解説
オレンジ色で示しているのが、新たに加えたコードである。キャメルケースでのInformUserクラスを追記した。クラスであれば、
__init__()メソッド以外にもメソッドが必ずあるはずだから、初期化される追加分の属性が必ず存在する。ゆえに、__init__()メソッドにself以外の引数がなくても構わないことになる。 statement = ''はinform_disturbance()メソッドの属性の初期化である。
class User:
def __init__(self, first_name, last_name):
"""属性を初期化する"""
self.given_name = first_name
self.family_name = last_name
def describe_user(self):
"""ユーザーの情報を出力する"""
print(f"ユーザー名:{self.given_name.title()} {self.family_name.title()}")
def greet_user(self):
"""ユーザーに挨拶をする"""
print(f"{self.given_name.title()}さん、こんにちは!\n")
class SecretUserInfo(User):
"""ユーザー情報の一部を非表示にするクラス"""
def __init__(self, first_name, last_name):
"""親クラスの属性を初期化する"""
super().__init__(first_name, last_name)
self.law = '' #子クラスの追加属性を初期化
def hide_law(self, law):
self.law = law
print(f"{self.law}により{self.given_name}を非表示にする。")
def hide_info(self):
self.given_name = '***'
print(f"ユーザー名:{self.given_name.title()} {self.family_name.title()}")
user_1 = SecretUserInfo('oamat', 'onusam') #子クラスのインスタンス化
user_1.describe_user() #親クラスのメソッド
user_1.greet_user() #親クラスのメソッド
user_1.hide_law('個人情報保護法') #子クラスのメソッド
user_1.hide_info() #子クラスのメソッド
#実行結果
ユーザー名:Oamat Onusam
Oamatさん、こんにちは!
個人情報保護法によりoamatを非表示にする。
ユーザー名:*** Onusam
新たに作っておいたクラスを利用可能である。元クラスを特殊化させたものであれば、継承を使用できる。継承とは元クラス、ここではUserクラスの持つ属性やメソッドを継承先クラス、ここではSecretUserInfoクラスが引き継ぐことができる。また、継承先での属性やメソッドも自由に定義できる。実行結果から、その事実が理解できよう。元クラスを親クラス、新しいクラスを子クラスと呼ぶ。なお、上の説明で#記号を用いているがPythonのコメントアウトに用いるもの。コメントアウトはコードに影響を与えない説明文である。ここでも説明に用いているが、使用する場所はpythonルールに則していないことに注意!!!
SecretUserInfoの引数にUserが入っているので、Userクラスの継承であることが分る。子クラスの__init__()メソッドの直下にsuper().__init__( )があるが、忘れないようにしよう。 __init__( )の直後にコロンは不必要。打ち込むことで自然と頭に入るはずである。self.lawは子クラスでの追加属性である。クラスの基本構造で見たように、__init__()の下に属性を追記した。それと同様に子クラスの属性であるから、子クラスの__init__()メソッドの下に追記したのである。
クラスの継承ではなく、独立したクラスを追記して、子クラスのインスタンスから、その追記したクラスの属性とメソッドにアクセスすることが可能である。 そのクラスでは全てのユーザーに障害を伝達表示するメッソドを持たせる。
class User:
def __init__(self, first_name, last_name):
"""属性を初期化する"""
self.given_name = first_name
self.family_name = last_name
def describe_user(self):
"""ユーザーの情報を出力する"""
print(f"ユーザー名:{self.given_name.title()} {self.family_name.title()}")
def greet_user(self):
"""ユーザーに挨拶をする"""
print(f"{self.given_name.title()}さん、こんにちは!\n")
class InformUser:
def __init__(self):
"""属性を初期化する"""
statement = ''
def inform_disturbance(self):
"""全てのユーザーへ障害を伝達する"""
self.statement = f"ユーザーの皆様へ:サーバーが混み合っておりアクセスしずらくなっております。"
print(self.statement)
class SecretUserInfo(User):
"""ユーザー情報の一部を非表示にするクラス"""
def __init__(self, first_name, last_name):
"""親クラスの属性を初期化する"""
super().__init__(first_name, last_name)
self.law = ''
self.informuser = InformUser()
def hide_law(self, law):
self.law = law
print(f"{self.law}により{self.given_name}を非表示にする。")
def hide_info(self):
self.given_name = '***'
print(f"ユーザー名:{self.given_name.title()} {self.family_name.title()}")
user_1 = SecretUserInfo('oamat', 'onusam') #子クラスのインスタンス化
user_1.describe_user()
user_1.greet_user()
user_1.hide_law('個人情報保護法')
user_1.hide_info()
user_1.informuser.inform_disturbance()
#実行結果
ユーザー名:Oamat Onusam
Oamatさん、こんにちは!
個人情報保護法によりoamatを非表示にする。
ユーザー名:*** Onusam
ユーザーの皆様へ:現在、サーバーが混み合っておりアクセスしずらくなっております。
SecretUserInfoのインスタンスを利用して、InformUserクラスを参照するために、SecretUserInfoの__init__()メソッドの下方に
self.informuser = InformUser()と追記している。self.informuserのinformuserの部分はコードの読み手に理解できる変数に変えても想定の出力が得られる。実行部分のuser_1.informuser.inform_disturbance()の経路を自分なりに解釈すれば、インスタンス化されたuser_1が参照されたSecretUserInfoクラスの属性を参照し、その中のinformuser属性にアクセスし、さらに、それが伝えるInformUserクラスにアクセスし、そのクラスのinform_disturbance()メソッドを実行せよ、となるだろう。
▲ トップへ戻る
戻る
カテゴリー