# クラスメソッドと静的メソッド
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]] <<ルーク>>
洗濯します。
この記事は役に立ちましたか?
もし参考になりましたら、下記のボタンで教えてください。
コメント