2020年10月8日木曜日

Python学習 クラス

概要

Pythonのクラスについて学習したので、使用例をまとめます。

クラスとメソッドとオブジェクトの作成


 # coding: utf-8

 #クラスとメソッドを作成
 class Player:
     def walk(self):
         print("ヒトカゲは荒野を歩いていた")
 
     def attack(self, enemy):
         print("ヒトカゲは" + enemy + "を攻撃した")

 #Playerクラスから作ったオブジェクトを変数に代入
 player1 = Player()

 #変数でメソッドを実行
 player1.walk()
 player1.attack("ゼニガメ")
 


クラスと初期化を行うコンストラクタ


 # coding: utf-8

 class Player:
    
     #オブジェクトの初期化を行うコンストラクタ
     #オブジェクトを作るとき最初に呼ばれる
     #selfはインスタンス変数を使うときに必要となる。
     #メソッドの呼び出しに使ったオブジェクト自身を示す。
     def __init__(self, job):
         #インスタンス変数にjobの値を入れる
         self.job = job

     def walk(self):
         print(self.job + "は歩いていた")

 player1 = Player("ヒトカゲ")
 player1.walk()
 


引数と戻り値のあるメソッドを使う


 # coding: utf-8

 class Item:
     #クラス変数
     tax = 1.08
 
     def __init__(self, price, quantity):
         #インスタンス変数に引数を代入
         self.price = price
         self.quantity = quantity

     def total(self):
         #インスタンスから合計を算出。小数点以下を切り捨てる為int関数を使う
         return int(self.price * self.quantity * Item.tax)

 #オブジェクトを作成
 orange = Item(85, 32)
 print("合計金額は" + str(orange.total()) + "円です")


テキストデータを操作するメソッドを使う


 # coding: utf-8

 text = "pYthon"

 #通常表示
 print(text)

 #先頭の文字だけを大文字に変換
 print(text.capitalize())

 #全ての文字を大文字に変換
 print(text.upper())
 
 #文字列が小文字ならTrue。そうでなければFalse。
 print(text.islower())


クラスの中でしか使えないプライベート関数、プライベート変数


 # coding: utf-8

 class Player:
     def __init__(self, job, weapon):
         self.job = job
         #プライベート変数
         self.__weapon = weapon

     def walk(self):
         print(self.job + "は草むらを歩いていた")
         self.__attack("ピカチュウ")

     #プライベート関数
     def __attack(self, enemy):
         print(self.__weapon + "で" + enemy + "を攻撃")

 player1 = Player("サトシ", "棒")
 player1.walk()


継承を使ってスーパークラスとサブクラスを定義する


 # coding: utf-8

 #スーパークラスを定義
 class Box:
     def __init__(self, item):
         self.item = item

     def open(self):
         print("宝箱を開いた。" + self.item + "を手に入れた。")

 #サブクラスを定義
 class JewelryBox(Box):
     def look(self):
         print("宝箱はキラキラと輝いている。")

 #スーパークラスのメソッドが使える
 box = Box("鋼鉄の剣")
 box.open()

 #スーパークラスとサブクラスのメソッドが使える
 jewelrybox = JewelryBox("魔法の指輪")
 jewelrybox.look()
 jewelrybox.open()
 


スーパークラスで定義されたメソッドを書き換える


 # coding: utf-8
 
 class Box:
     def __init__(self, item):
         self.item = item

     def open(self):
         print("宝箱を開いた。" + self.item + "を手に入れた。")

 class MagicBox(Box):
     def look(self):
         print("宝箱は、妖しく輝いている。")
        
     #openメソッドで行われる処理を書き換える(オーバーライド)
     def open(self):
         print("宝箱を開いた。" + self.item + "が襲ってきた!")

 box = Box("やくそう")
 box.open()

 magicbox = MagicBox("ミミック")
 magicbox.look()
 magicbox.open()


サブクラスからスーパークラスで定義されたメソッドを呼び出す


 # coding: utf-8
 
 class Player:
     def __init__(self, name):
         self.name = name

     def attack(self, enemy):
         print(self.name + "は、" + enemy + "を攻撃した!")

 class Wizard(Player):
     def __init__(self):
         #スーパークラスのメソッドに引数を与えて呼び出す
         super().__init__("魔法使い")

     def attack(self, enemy):
         self.__spell()
         print(self.name + "は、" + enemy + "に炎を放った!")


 print("=== パーティーでスライムと戦う ===")
 hero = Player("勇者")
 warrior = Player("戦士")
 wizard = Wizard()

 party = [hero, warrior, wizard]
 for member in party:
     member.attack("スライム")


クラスメソッドをデコレータで定義する


 class Player:
     __charactor_count = 0

     #クラス変数を扱うクラスメソッドをデコレータで定義
     #引数をclsにしてクラス自身を取り込み
     @classmethod
     def summary(cls):
         print(str(Player.__charactor_count) + "人で、スライムを攻撃した。")

     def __init__(self, name):
         self.name = name
         Player.__charactor_count += 1
         print(str(Player.__charactor_count) + "番目のプレイヤー、" + self.name + "が登場した。")

     def attack(self, enemy):
         print(self.name + "は、" + enemy + "を攻撃した!")
        

 class Wizard(Player):
     def __init__(self):
         super().__init__("魔法使い")

     def attack(self, enemy):
         self.__spell()
         print(self.name + "は、" + enemy + "に炎を放った!")

     def __spell(self):
         print("ズバーン!")

 print("=== パーティーでスライムと戦う ===")
 hero = Player("勇者")
 warrior = Player("戦士")
 wizard = Wizard()

 party = [hero, warrior, wizard]
 for member in party:
     member.attack("スライム")

 Player.summary()


datetimeオブジェクトを使う


 from datetime import datetime, timedelta, timezone

 #日本時間に設定
 jst   = timezone(timedelta(hours=9))
 today = datetime.now(jst)
 print(today)
 print(today.year)
 print(today.month)
 print(today.day)

 #データを成形
 day = datetime.strptime("2030/01/10 06:02:19", "%Y/%m/%d %H:%M:%S")
 print(day)

0 件のコメント:

コメントを投稿