アプリとサービスのすすめ

アプリやIT系のサービスを中心に書いていきます。たまに副業やビジネス関係の情報なども気ままにつづります

個人的なpythonのclassと継承、super、その他*argsとかのアウトプットまとめ

class、継承や*argsとか、pythonでまだまともに使ったことがないメソッドが多かったので、暇がある機会に学習した。なので淡々と書くアウトプットログ。

早く身につけるコツはこの一年で大分学んだ。基礎を学んだら、問題設定でもなんでもして、さっさとアウトプットして使いまくれば、参考書読んでるよりよっぽど早く身についた。


目次
・classのアウトプット
・*argsと**kwargsのアウトプット
・lambdaとmapメソッドのアウトプット

f:id:trafalbad:20190404120328p:plain

classのアウトプット

ワンピースの覇気の計算式

シリーズは「アラバスタ編、空島、エニエスロビー、スリラーバーグ、魚人島、ドフラミンゴ編、ビッグマム編
を対象にした。

覇気の能力upは
・覇気は極限の戦闘状態でこそ強さが増す
・本人の気質が反映される

という二点を考慮して、自分で勝手に変数を以下のように決めた

who:ルフィ、ゾロ、サンジ

kisitu(気質):覇王色=ルフィ、武装色=ゾロ、見聞色=サンジ

battle_rank:シリーズ回毎の対戦相手の強さ:1〜5(5段階rank)

out_limit_count:限界を超えた力を出さざるを得ないシーンがあったか

how_hurt:どのくらい傷ついたか:1〜5(5段階rank)

count:シリーズの回数=7回(アラバスタ編、空島、エニエスロビー、スリラーバーグ、魚人島、ドフラミンゴ編、ビッグマム編)

# ルフィの覇気
class LUFFY:
    def __init__(self, who, battle_rank, how_hurt, out_limit_count, count=7, kisitu=1):
        self.who = who
        self.kisitu=kisitu
        self.battle_rank=battle_rank
        self.out_limit_count=out_limit_count
        self.how_hurt=how_hurt
        self.count=count
    def hao_syoku(self):
        if self.who is 'luffy':   # ルフィにしかないので気質はなし
            limiter_situation = lambda count, hurt:(count+hurt)*self.out_limit_count # 戦闘での極限状態
            hao_level=(self.battle_rank)*limiter_situation(self.count, self.how_hurt)
        else:
            hao_level=0
        return hao_level
            
    def kenbun_syoku(self, *args):
        if self.who is 'sanzi':
            kisitu=self.kisitu*2
        else:
            kisitu=self.kisitu
        limiter_situation =lambda counts, anything:(counts+anything)*self.out_limit_count # 戦鬪での極限状態
        epsil=limiter_situation(self.count, *args)
        kenbun_level=(kisitu+self.battle_rank)*epsil
        return kenbun_level
    def buso_syoku(self, weapon):
        if self.who is 'zoro':
            kisitu=self.kisitu*2
        else:
            kisitu=self.kisitu
        # 全キャラで武装色関連の極限戦闘シーンないので「戦鬪での極限状態」なし
        buso_level=(weapon+kisitu+self.battle_rank)*self.count
        return buso_level
    
    def total_haki(self,weapon, *args):
        total_power=self.hao_syoku() + self.kenbun_syoku(*args) + self.buso_syoku(weapon)
        return total_power
    
# インスタンス化  
luffy=LUFFY('luffy', 5, 5, 4)
print('ルフィ覇王色Lv {}'.format(luffy.hao_syoku()))
print('ルフィ見聞色Lv {}'.format(luffy.kenbun_syoku(8))) # カタクリ戦=8
print('ルフィ武装色Lv {}'.format(luffy.buso_syoku(weapon=6))) # weapon=ゴムゴムの実
print('total 覇気Lv {}'.format(luffy.total_haki(6, 8)))

"""
ルフィ覇王色Lv 240
ルフィ見聞色Lv 360
ルフィ武装色Lv 84
total 覇気Lv 684
"""


# ルフィの計算式用のクラスを継承でゾロとサンジに適用

# 継承用クラス作成
class ZORO(LUFFY):
    def __init__(self, who, battle_rank, how_hurt, out_limit_count, count=7, kisitu=1):
        zoro_class=super(ZORO, self)
        zoro_class.__init__(who, battle_rank, how_hurt, out_limit_count)
        
class SANZI(LUFFY):
    def __init__(self, who, battle_rank, how_hurt, out_limit_count, count=7, kisitu=1):
        sanzi_class=super(SANZI, self)
        sanzi_class.__init__(who, battle_rank, how_hurt, out_limit_count)

# インスタンス化して覇気を計算
# ゾロ
zoro=ZORO('zoro', 3, 4, 2)
print('ゾロ覇王色Lv {}'.format(zoro.hao_syoku()))
print('ゾロ見聞色Lv {}'.format(zoro.kenbun_syoku(0)))
print('ゾロ武装色Lv {}'.format(zoro.buso_syoku(weapon=12))) # weapon=刀3本
print('total 覇気Lv {}'.format(zoro.total_haki(12, 0)))
"""
ゾロ覇王色Lv 0
ゾロ見聞色Lv 56
ゾロ武装色Lv 119
total 覇気Lv 175
"""
# サンジ
sanzi=SANZI('sanzi', 2, 2, 1)
print('サンジ覇王色Lv {}'.format(sanzi.hao_syoku()))
print('サンジ見聞色Lv {}'.format(sanzi.kenbun_syoku(0)))
print('サンジ武装色Lv {}'.format(sanzi.buso_syoku(weapon=2))) # weapon=足
print('total 覇気Lv {}'.format(sanzi.total_haki(2, 0)))

"""
サンジ覇王色Lv 0
サンジ見聞色Lv 28
サンジ武装色Lv 35
total 覇気Lv 63
"""

やっぱりルフィは強敵と戦ってるし、覇気鍛えまくってるから高い。特に見聞色はカタクリ戦で未来見れるようになったから、カタクリ戦を変数に入れた。

ゾロは剣士で、ミホークの修行受けてるので武装色高め。
サンジは覇気をおまけ的な感じで使ってるからtotalで低い。



その他のclass関連アウトプット

# 簡単なクラス
class food:
    imp=34
    def atomosphere(self):
        f=10
        return f
# インスタンス化
rest=food()
# 変数
rest.imp 
# >>>34

# 関数
rest.atomosphere()
# >>>10
# class内の変数使う場合
class food:
    imp=34
    def atomosphere(self):
        f=10+self.imp
        return f
rest=food()
rest.atomosphere()
# >>> 44
# 初期化変数ありclass
class staffmoney:
    def __init__(self, ids):
        self.id=ids
        print('get class') # はじめに行う処理
    def hour(self, hour):
        h=1+hour
        return h
    def money(self, money):
        m=10000+money
        return m
    def rank(self, rank):
        r=1+rank
        return r
    
# インスタンス化する & idsに'A'を代入
df=staffmoney('A')
print(df.id)
print(df.hour(3))
print(df.money(4000))
print(df.rank(3))

"""
get class
A
4
14000
4
"""
# 継承
# ベースclass作成
class naruto:
    def __init__(self, zyutu):
        self.utiha=zyutu
    def madara(self):
        print('susanoo')
    def obito(self):
        ms=lambda x:x*2
        print(ms(2))
    def sasuke(self):
        print(self.utiha)
        
uzumaki=naruto('螺旋丸')
uzumaki.obito()
# >>> 4


# 継承 & zyutu変数を子クラスで書き換えられるようにした
class ninzyutu(naruto):
    def __init__(self, zyutu):
        ninzya=super(ninzyutu, self)
        ninzya.__init__(zyutu)
        
# zyutu変数書き換え
fire=ninzyutu('業火滅失')
fire.obito()
# >>> 4
# inception_resnet_v2とそのinput関数の模擬的なclass化

class inception_resnet_v2:
    def conv2d_bn(self, x):
        return x


    def inception_resnet_block(self, scale):
        a=self.conv2d_bn(5)+scale
        return a

    def InceptionResNetV2(self, image):
        
        x = self.conv2d_bn(10) # 10
       
        g = self.inception_resnet_block(10) # 15

        return g+x+image # 25+image


class INPUT:
    def inputed(self, data_files, batch_size, train=True, num_readers = 60):
        if train==True:
            serialized_example=400
            # self.関数でclass内の関数の呼び出し
            image, label=self.parse_example_proto(serialized_example)
        return image, label
    def parse_example_proto(self, serialized_example):
        image=33+serialized_example
        label=serialized_example+28
        return image, label
    
i=inception_resnet_v2()
print(i.InceptionResNetV2(10))
# >>> 35
train_input=INPUT()
image, label=train_input.inputed(data_files=30, batch_size=22)
print(image)
print(label)

# >>> 433
# >>> 428


*argsと**kwargsのアウトプット

*args

# *args :引数をいくらでも取れる
def mys(*args):
    return args

a=mys(1,4,5,6,7,7,8)
print(a)
# >>> (1, 4, 5, 6, 7, 7, 8)


class animalbody:
    def __init__(self, *args):
        self.b=args
    def body(self):
        print('skin')
    def arm(self):
        print(self.b)
        
dds=animalbody('腕','手', '憎しみ')
dds.arm()
# >>> ('腕', '手', '憎しみ')



**kwargs

# **kargs:dicの引数をいくらでも取れる
def dic_mys(**kargs):
    return kargs

b=dic_mys(b=4, f=2, cc=7)
print(b)
# {'b': 4, 'f': 2, 'cc': 7}

class bomclass:
    def __init__(self, **kargs):
        self.dds=kargs
        self.kd=kargs
    def h2o(self, water):
        return water
    def herium(self):
        return self.kd, self.dds
    
bom=bomclass(v=12, c=45, oroti=45)
print(bom.herium())
# ({'v': 12, 'c': 45, 'oroti': 45}, {'v': 12, 'c': 45, 'oroti': 45})

ガチなclassと**kwargsの使い方

# LSTMみたいにQRNN(64, window_size=12, dropout=0)みたいに使うには、変数を定義したあとでこう書く(らしい:at my github's qrnn.py)
from keras.layers import Layer

class QRNN(Layer):
    def __init__(self, level, kisitu=None, **kwargs):
        self.level=level
        super(QRNN, self).__init__(**kwargs)


lambdaとmapメソッドのアウトプット

# lambda と mapメソッド
ms = lambda a,b: (a - b)**2 # def ms(a, b)
ms(5,2)
# >>> 9 (5-2=3 and 3**2)

l=[1,2,3]
l2=list(map(lambda x:x**2, l))
l2 # [1, 4, 9]


学ぶ必要があれば、その都度追記でアプトプット予定