クラス

# クラスメソッドと静的メソッド

class Super():
    name = '親クラス'

    @classmethod
    def class_method(cls) -> None:
        print(f'class_method : {cls.name}')

    @staticmethod
    def static_method() -> None:
        print(f'static_method : {Super.name}')

class Sub(Super):
    name = '子クラス'

Super.class_method()
Super.static_method()
print()

Sub.class_method()
Sub.static_method()

C:>python class_static.py
class_method : 親クラス
static_method : 親クラス

class_method : 子クラス
static_method : 親クラス

# 識別番号付き武将クラス

class Commander:
    """武将クラス"""

    __counter = 0   # 何番までの識別番号を与えたか

    def __init__(self, name: str) -> None:
        """コンストラクタ"""
        self.__name = name
        Commander.__counter += 1
        self.__id = Commander.__counter

    def id(self) -> int:
        """"識別番号を取得"""
        return self.__id

    @classmethod
    def max_id(cls) -> int:
        """"現時点で何番までの識別番号を与えたのか"""
        return cls.__counter

    def print(self) -> None:
        """データ表示"""
        print(f'{self.__name}:{self.__id}番')

oda = Commander('織田信長')             # 識別番号は1
toyotomi = Commander('豊臣秀吉')        # 識別番号は2
tokugawa = Commander('徳川家康')        # 識別番号は3

print(f'oda.id() = {oda.id()}')
print(f'toyotomi.id() = {toyotomi.id()}')
print(f'tokugawa.id() = {tokugawa.id()}')

print(f'Commander.max_id() = {Commander.max_id()}')
print(f'oda.max_id() = {oda.max_id()}')

C:>python Commander.py
oda.id() = 1
toyotomi.id() = 2
tokugawa.id() = 3
Commander.max_id() = 3
oda.max_id() = 3

# 名前修飾を確認

class C():
    __abc = 5

# OK:変更後の名前でアクセス可能
print(C._C__abc)

# エラー:本来の名前ではアクセス不能
print(C.__abc)

C:>python list11c01.py
5
Traceback (most recent call last):
File “C:\list11c01.py”, line 10, in
print(C.__abc)
^^^^^^^
AttributeError: type object ‘C’ has no attribute ‘__abc’. Did you mean: ‘_C__abc’?

# スポーツクラブの会員クラス(第1版)

class Member:
    """スポーツクラブの会員クラス(第1版)"""
    pass

# 会員クラスのテスト

yamada = Member()
yamada.no = 15
yamada.name = '山田太郎'
yamada.weight = 72.7

sekine = Member()
sekine.no = 37
sekine.name = '関根信彦'
sekine.weight = 65.3

print(f'{yamada.no}: {yamada.name} {yamada.weight}kg')
print(f'{sekine.no}: {sekine.name} {sekine.weight}kg')

C:>python Member01.py
15: 山田太郎 72.7kg
37: 関根信彦 65.3kg

# スポーツクラブの会員クラス(第1版:綴りミスを含む)

class Member:
    """スポーツクラブの会員クラス(第1版)"""
    pass

# 会員クラスのテスト

yamada = Member()
yamada.no = 15
yamada.name = '山田太郎'
yamada.weight = 72.7

sekine = Member()
sekine.no = 37
sekine.name = '関根信彦'
sekine.weigth = 65.3

print(f'{yamada.no}: {yamada.name} {yamada.weight}kg')
print(f'{sekine.no}: {sekine.name} {sekine.weight}kg')

C:>python Member01x.py
15: 山田太郎 72.7kg
Traceback (most recent call last):
File “C:\Member01x.py”, line 20, in
print(f'{sekine.no}: {sekine.name} {sekine.weight}kg’)
^^^^^^^^^^^^^
AttributeError: ‘Member’ object has no attribute ‘weight’. Did you mean: ‘weigth’?

# スポーツクラブの会員クラス(第2版)

class Member:
    """スポーツクラブの会員クラス(第2版)"""

    def __init__(self, no: int, name: str, weight: float) -> None:
        """コンストラクタ"""
        self.no = no            # 会員番号
        self.name = name        # 氏名
        self.weight = weight    # 体重

    def print(self) -> None:
        """データ表示"""
        print(f'{self.no}: {self.name} {self.weight}kg')

# 会員クラスのテスト

yamada = Member(15, '山田太郎', 72.7)
sekine = Member(37, '関根信彦', 65.3)

yamada.print()
sekine.print()

C:>python Member02.py
15: 山田太郎 72.7kg
37: 関根信彦 65.3kg

# スポーツクラブの会員クラス(第3版)

class Member:
    """スポーツクラブの会員クラス(第3版)"""

    def __init__(self, no: int, name: str, weight: float) -> None:
        """コンストラクタ"""
        self.__no = no
        self.__name = name
        self.__weight = weight

    def lose_weight(self, loss: float) -> None:
        """lossキロ減量"""
        self.__weight -= loss

    def print(self) -> None:
        """データ表示"""
        print(f'{self.__no}: {self.__name} {self.__weight}kg')

# 会員クラスのテスト

yamada = Member(15, '山田太郎', 72.7)
sekine = Member(37, '関根信彦', 65.3)

yamada.lose_weight(3.5)     # 山田君が3.5kg減量
sekine.lose_weight(5.3)     # 関根君が5.3kg減量

yamada.print()
sekine.print()

C:>python Member03.py
15: 山田太郎 69.2kg
37: 関根信彦 60.0kg

# スポーツクラブの会員クラス(第4版)

class Member:
    """スポーツクラブの会員クラス(第4版)"""

    def __init__(self, no: int, name: str, weight: float) -> None:
        """コンストラクタ"""
        self.__no = no
        self.__name = name
        self.__weight = weight

    def lose_weight(self, loss: float) -> None:
        """lossキロ減量"""
        self.__weight -= loss

    def print(self) -> None:
        """データ表示"""
        print(f'{self.__no}: {self.__name} {self.__weight}kg')

    @property
    def weight(self) -> float:
        """体重を取得(ゲッタ)"""
        return self.__weight

    @weight.setter
    def weight(self, weight: float) -> None:
        """体重を設定(セッタ)"""
        self.__weight = weight if weight > 0.0 else 0.0

# 会員クラスのテスト

yamada = Member(15, '山田太郎', 72.7)

yamada.weight = 67.3                        # 山田君の体重を設定
print('yamada.weight =', yamada.weight)     # 山田君の体重を取得

C:>python Member04.py
yamada.weight = 67.3

# ペットクラス

class Pet:
    """ペットクラス"""

    def __init__(self, name: str, master: str) -> None:
        """コンストラクタ"""
        self._name = name           # 名前
        self._master = master       # 主人の名前

    def introduce(self) -> None:
        """自己紹介"""
        print(f'僕の名前は{self._name}です!')
        print(f'ご主人様は{self._master}です!')

    def __str__(self) -> str:
        """文字列化"""
        return self._name + ' <<' + self._master + '>>'

    def print(self) -> None:
        """表示(__str__が返却する文字列を表示して改行)"""
        print(self.__str__())

# ペットクラスのテスト
kurt = Pet('Kurt', 'アイ')
kurt.introduce()
print(kurt)
print('str(Kurt) = ' + str(kurt))
kurt.print()

C:>python Pet.py
僕の名前はKurtです!
ご主人様はアイです!
Kurt <<アイ>>
str(Kurt) = Kurt <<アイ>>
Kurt <<アイ>>

# ペットクラスとロボットペットクラス

class Pet:
    """ペットクラス"""

    def __init__(self, name: str, master: str) -> None:
        """コンストラクタ"""
        self._name = name           # 名前
        self._master = master       # 主人の名前

    def introduce(self) -> None:
        """自己紹介"""
        print(f'僕の名前は{self._name}です!')
        print(f'ご主人様は{self._master}です!')

    def __str__(self) -> str:
        """文字列化"""
        return self._name + ' <<' + self._master + '>>'

    def print(self) -> None:
        """表示(__str__が返却する文字列を表示して改行)"""
        print(self.__str__())

class RobotPet(Pet):
    """ロボットペットクラス"""

    def __init__(self, name: str, master: str, type_no: str) -> None:
        """コンストラクタ"""
        super().__init__(name, master)  # 基底クラスのコンストラクタを呼び出す
        self._type_no = type_no         # 型番

    def introduce(self) -> None:
        """自己紹介"""
        print(f'◆僕はロボット。名前は{self._name}。')
        print(f'◆型番は{self._type_no}。')
        print(f'◆僕の主人は{self._master}。')

    def __str__(self) -> str:
        """文字列化"""
        return(self._name + ' [[' + self._type_no + ']]'
                          + ' <<' + self._master + '>>')

    def work(self, sw: int) -> None:
        """家事を行う"""
        match sw:
            case 0: print('掃除します。')
            case 1: print('洗濯します。')
            case 2: print('炊事します。')

# ペットクラス群のテスト

kurt = Pet('Kurt', 'アイ')
kurt.introduce()
print(kurt)

r2d2 = RobotPet('R2D2', 'ルーク', 'R2')
r2d2.introduce()
print(r2d2)

def self_introduce(obj: object) -> None:
    """objに対して自己紹介をお願いする"""
    obj.introduce()

self_introduce(kurt)
self_introduce(r2d2)

# ペットクラス群のテスト(続き)

# kurtはPet型インスタンス
kurt.print()

# r2d2はRobotPet型インスタンス
r2d2.print()

r2d2.work(1)

C:>python RobotPet.py
僕の名前はKurtです!
ご主人様はアイです!
Kurt <<アイ>>
◆僕はロボット。名前はR2D2。
◆型番はR2。
◆僕の主人はルーク。
R2D2 [[R2]] <<ルーク>>
僕の名前はKurtです!
ご主人様はアイです!
◆僕はロボット。名前はR2D2。
◆型番はR2。
◆僕の主人はルーク。
Kurt <<アイ>>
R2D2 [[R2]] <<ルーク>>
洗濯します。

この記事は役に立ちましたか?

もし参考になりましたら、下記のボタンで教えてください。

関連記事

コメント

この記事へのコメントはありません。