プログラ生活

プログラム初学者のためのポイントを書いていこうと思います。たまに脇道それた記事もありますが、息抜きだとおもって気長にお付き合いください。

【Python連載】クラス (継承)-023-

www.pon-x.jp

今回は前回までの続き、クラスの続きです。

クラスの継承

今回は、クラスを別のクラスで用いる継承を紹介します。

まずは、前回までのストーリーにもとづいて以下のクラスを作ってみましょう。

class Character:
    def __init__ (self, job, HP, weapon):# コンストラクタを定義して、初期値を決める。
        self.job = job
        self.HP = HP
        self.level = 1
        self.comment = self.job + "が誕生した"
        
    def set_status(self, set_HP): # レベルとHPを上げるメソッドに変更
        self.level += 1 # レベルを1ずつ上げる(1ずつと分かっているので引数はいらない)
        self.HP += set_HP # さっきまでは直接代入したが、増加分に変更する
        self.comment = self.job + "はレベルが上がった"
        
    def print_status(self): #表示するためのメソッド
        print("職業 : " + self.job)
        print("H  P : " + str(self.HP))
        print("武器 : " + self.weapon)
        print("レベル : " + str(self.level))
        print("※ " + self.comment)

上記は、キャラクターを誕生させ、レベルアップさせるメソッドがあることがわかります。

継承

次に、Characterメソッドを活用して別のクラスを作ります。

class Child(Character):
    def __init__(self, job, HP, weapon, comment):
        super().__init__(job, HP,weapon)
        self.weapon = weapon
        self.comment = comment
        
    def powerUp(self):
        self.HP += 100
        self.comment = "孫勇者のレベルが上がった"

Childクラスは、Characterクラスを継承しています。
これは、Characterクラスを用いてChildクラスを作っていると思ってください。
ひとつずつ説明します。

def __init__(self, job, HP, weapon, comment):

Childクラスのコンストラクタです。

super().__init__(job, HP,weapon)

superは親クラス、つまりCharacterクラスのことです。
つまり、今回はCharacterクラスのコンストラクタに対して、引数を渡しているということすね。

self.weapon = weapon
self.comment = comment

アトリビュートに引数の値を代入します。

def powerUp(self):
     self.HP += 100
     self.comment = "孫勇者のレベルが上がった"

レベルアップメソッドを設定します。

インスタンス化してみる。

print("-------------------------")
child_yusya = Child("勇者" , 100 , "はがねの剣" , "孫勇者がうまれた")
child_yusya.print_status()
print("-------------------------")

for i in range(5):
    print("-------------------------")
    child_yusya.powerUp()
    child_yusya.print_status()
    print("-------------------------")

f:id:hanabusa-snow:20211201085622p:plain

全ソースはこちら

class Character:
    def __init__ (self, job, HP, weapon):# コンストラクタを定義して、初期値を決める。
        self.job = job
        self.HP = HP
        self.level = 1
        self.comment = self.job + "が誕生した"
        
    def set_status(self, set_HP): # レベルとHPを上げるメソッドに変更
        self.level += 1 # レベルを1ずつ上げる(1ずつと分かっているので引数はいらない)
        self.HP += set_HP # さっきまでは直接代入したが、増加分に変更する
        self.comment = self.job + "はレベルが上がった"
        
    def print_status(self): #表示するためのメソッド
        print("職業 : " + self.job)
        print("H  P : " + str(self.HP))
        print("武器 : " + self.weapon)
        print("レベル : " + str(self.level))
        print("※ " + self.comment)

class Child(Character):
    def __init__(self, job, HP, weapon, comment):
        super().__init__(job, HP,weapon)
        self.weapon = weapon
        self.comment = comment
        
    def powerUp(self):
        self.HP += 100
        self.comment = "孫勇者のレベルが上がった"

print("-------------------------")
child_yusya = Child("勇者" , 100 , "はがねの剣" , "孫勇者がうまれた")
child_yusya.print_status()
print("-------------------------")

for i in range(5):
    print("-------------------------")
    child_yusya.powerUp()
    child_yusya.print_status()
    print("-------------------------")

【Python連載】クラス (継承)-023-

www.pon-x.jp

今回は前回までの続き、クラスの続きです。

クラスの継承

今回は、クラスを別のクラスで用いる継承を紹介します。

まずは、前回までのストーリーにもとづいて以下のクラスを作ってみましょう。

class Character:
    def __init__ (self, job, HP, weapon):# コンストラクタを定義して、初期値を決める。
        self.job = job
        self.HP = HP
        self.level = 1
        self.comment = self.job + "が誕生した"
        
    def set_status(self, set_HP): # レベルとHPを上げるメソッドに変更
        self.level += 1 # レベルを1ずつ上げる(1ずつと分かっているので引数はいらない)
        self.HP += set_HP # さっきまでは直接代入したが、増加分に変更する
        self.comment = self.job + "はレベルが上がった"
        
    def print_status(self): #表示するためのメソッド
        print("職業 : " + self.job)
        print("H  P : " + str(self.HP))
        print("武器 : " + self.weapon)
        print("レベル : " + str(self.level))
        print("※ " + self.comment)

上記は、キャラクターを誕生させ、レベルアップさせるメソッドがあることがわかります。

継承

次に、Characterメソッドを活用して別のクラスを作ります。

class Child(Character):
    def __init__(self, job, HP, weapon, comment):
        super().__init__(job, HP,weapon)
        self.weapon = weapon
        self.comment = comment
        
    def powerUp(self):
        self.HP += 100
        self.comment = "孫勇者のレベルが上がった"

Childクラスは、Characterクラスを継承しています。
これは、Characterクラスを用いてChildクラスを作っていると思ってください。
ひとつずつ説明します。

def __init__(self, job, HP, weapon, comment):

Childクラスのコンストラクタです。

super().__init__(job, HP,weapon)

superは親クラス、つまりCharacterクラスのことです。
つまり、今回はCharacterクラスのコンストラクタに対して、引数を渡しているということすね。

self.weapon = weapon
self.comment = comment

アトリビュートに引数の値を代入します。

def powerUp(self):
     self.HP += 100
     self.comment = "孫勇者のレベルが上がった"

レベルアップメソッドを設定します。

インスタンス化してみる。

print("-------------------------")
child_yusya = Child("勇者" , 100 , "はがねの剣" , "孫勇者がうまれた")
child_yusya.print_status()
print("-------------------------")

for i in range(5):
    print("-------------------------")
    child_yusya.powerUp()
    child_yusya.print_status()
    print("-------------------------")

f:id:hanabusa-snow:20211201085622p:plain

全ソースはこちら

class Character:
    def __init__ (self, job, HP, weapon):# コンストラクタを定義して、初期値を決める。
        self.job = job
        self.HP = HP
        self.level = 1
        self.comment = self.job + "が誕生した"
        
    def set_status(self, set_HP): # レベルとHPを上げるメソッドに変更
        self.level += 1 # レベルを1ずつ上げる(1ずつと分かっているので引数はいらない)
        self.HP += set_HP # さっきまでは直接代入したが、増加分に変更する
        self.comment = self.job + "はレベルが上がった"
        
    def print_status(self): #表示するためのメソッド
        print("職業 : " + self.job)
        print("H  P : " + str(self.HP))
        print("武器 : " + self.weapon)
        print("レベル : " + str(self.level))
        print("※ " + self.comment)

class Child(Character):
    def __init__(self, job, HP, weapon, comment):
        super().__init__(job, HP,weapon)
        self.weapon = weapon
        self.comment = comment
        
    def powerUp(self):
        self.HP += 100
        self.comment = "孫勇者のレベルが上がった"

print("-------------------------")
child_yusya = Child("勇者" , 100 , "はがねの剣" , "孫勇者がうまれた")
child_yusya.print_status()
print("-------------------------")

for i in range(5):
    print("-------------------------")
    child_yusya.powerUp()
    child_yusya.print_status()
    print("-------------------------")

【Python連載】クラス (コンストラクタ)-022-

www.pon-x.jp

今回は前回までの続き、クラスの続きです。

コンストラクタ

前回はメソッドについて触れてきました。今回は、コンストラクタを説明します。
コンストラクタは端的に言うと、クラスをインスタンス化したときに同時に実行されるメソッドで、最初に実行されるため「初期化メソッド」とも呼ばれています。

コンストラクタ

さっそくやってみます。

class Test:
    def __init__ (self, name):
        self.name = name
        
    def print(self):
        print(self.name)
    
human = Test("田中")
human.print()

f:id:hanabusa-snow:20211118090038p:plain

コンストラクタはメソッドの名前を「init」とします。
こうすると、Test("田中")でインスタンス化したときに自動的にinitの中身が実行されており、self.name = nameに「田中」が入ります。
その後、printメソッドで表示をしているというわけです。

前回までのストーリー仕立てでやってみる。

class Character:
    def __init__ (self, job, HP):# コンストラクタを定義して、初期値を決める。
        self.job = job
        self.HP = HP
        self.level = 1
        self.comment = self.job + "が誕生した"
        
    def set_status(self, set_HP): # レベルとHPを上げるメソッドに変更
        self.level += 1 # レベルを1ずつ上げる(1ずつと分かっているので引数はいらない)
        self.HP += set_HP # さっきまでは直接代入したが、増加分に変更する
        self.comment = self.job + "はレベルが上がった"
        
    def print_status(self): #表示するためのメソッド
        print("職業 : " + self.job)
        print("H  P : " + str(self.HP))
        print("レベル : " + str(self.level))
        print("※ " + self.comment)


yusya = Character("勇者" , 100) # インスタンス作成時にコンストラクタで初期化される。

kenja = Character("賢者" , 70) # インスタンス作成時にコンストラクタで初期化される。


#誕生したキャラクターを確認しましょう。
print("-------------")

yusya.print_status()

print("-------------")

kenja.print_status()

print("-------------")

f:id:hanabusa-snow:20211118090449p:plain

このあとレベルを上げるために、インスタンスはそのままにメソッドだけ更新する。

# set_statusでアトリビュートを更新してみましょう。
# 実行を繰り返してみるとレベルとHPがどんどん上がる。

yusya.set_status(20) # HPを20上げる
kenja.set_status(10) # HPを10上げる

# 表示するするメソッドを使ってみよう。

print("-------------")

yusya.print_status()

print("-------------")

kenja.print_status()

print("-------------")

f:id:hanabusa-snow:20211118090613p:plain

いかがでしょうか。
クラスを使うと、処理が効率的になることが実感いただけだのではないでしょうか!?
次回もクラスの続きを書く予定です。

【Python連載】クラス (メソッド)-021-

www.pon-x.jp

今回は前回までの続き、クラスの続きです。

メソッド

前回はクラスとインスタンスについて触れましたが、今回はメソッドについて触れていきます。
メソッドは端的に言うと、クラス内に作る関数です。

前回に引き続き、今回もストーリー仕立てで進めていきます。

勇者と賢者に初期設定を与えるメソッドを作ります。

# selfでインスタンスを定義します。
class Character:
    
    def set_status(self , set_job , set_HP , set_weapon): # 値を設定するメソッドを定義
        self.job = set_job
        self.HP = set_HP
        self.weapon = set_weapon
        
    def print_status(self): #表示するためのメソッド
        print(self.job)
        print(self.HP)
        print(self.weapon)

# yusyaがself自身になってインスタンスを作成します。
yusya = Character()
yusya.set_status("ネオ勇者" , 120 , "鋼鉄の剣")

# kenjaがself自身になってインスタンスを作成します。
kenja = Character()
kenja.set_status("偉い賢者" , 90 , "癒し系の杖")


# 表示するするメソッドを使ってみよう。

print("-------------")

yusya.print_status()

print("-------------")

kenja.print_status()

print("-------------")

f:id:hanabusa-snow:20211112100759p:plain

  1. まずクラスを作ります。selfというのは、インスタンス自身のことを示しています。ここは、キャラクター設定のテンプレートなので、まだキャラクターは誕生していません。
  2. Character()でインスタンス化を行っております。つまり、ここでキャラクターが誕生しています。
  3. yusya.set_status("ネオ勇者" , 120 , "鋼鉄の剣")で勇者の、kenja.set_status("偉い賢者" , 90 , "癒し系の杖")で賢者のステータスを設定しました。
  4. print_statusは設定値をprintしてあげるメソッドなので、ここで表示をしています。

いかがでしょうか。
結構慣れるまでしんどいですよね。

次回は、これにひきつづきコンストラクタというものを紹介します。

【Python連載】クラス-020-

www.pon-x.jp

今回は前回までの続き、クラスを紹介します。

クラス

クラスはプログラミング初学者にとてもつまづきやすいポイントになりますが、これを知っておくとそうでないとでは実際にプロダクト制作をするときにえらくかわってくるので、しっかり理解しましょう。
※ クラスは今回から数回に分けて説明します。

ストーリーをつくってみました。

クラスの必要性を理解していただくために、以下のようなストーリーを作ってみました。

以下はゲームのキャラクターを作るという目的でクラスを作っていきます。 ひとつひとつ、順を追って理解していきましょう。

# Characterという名前のクラスを作ります。 
# まずは、クラス内で何も処理をしません。

class Character:
    pass

f:id:hanabusa-snow:20211111083944p:plain
これを実行しただけでは何も起きません。

このクラスはテンプレートを作ったに過ぎないので、これを実態化するためのインスタンスを作ります。

# 変数yusyaとkenjaにそれぞれインスタンスを作成してみましょう。
yusya = Character()
kenja = Character()

f:id:hanabusa-snow:20211111084138p:plain
これで勇者と賢者のインスタンスができましたが、表示は何もありません。

クラス内の変数をアトリビュートなんて呼んだりもしますが、それぞれのインスタンスにアトリビュートを設定してあげましょう。

yusya.job = "勇者"
yusya.HP = 100
yusya.weapon = "はがねの剣"

kenja.job = "賢者"
kenja.HP = 70
kenja.weapon = "魔法の杖"

f:id:hanabusa-snow:20211111084331p:plain 設定しただけなので、これも何も表示がありません。

表示してみます。

# 表示してみましょう。

print("---------------")
print(yusya.job)
print(yusya.HP)
print(yusya.weapon)
print("---------------")
print(kenja.job)
print(kenja.HP)
print(kenja.weapon)
print("---------------")

先ほど設定した値が表示されました。
f:id:hanabusa-snow:20211111084418p:plain

このように、インスタンスごとにパラメータを保持することができるのがクラスの利点のひとつです。
次回以降もうちょっと掘り下げてみようと思います。

【Python連載】ユーザー定義関数-019-

www.pon-x.jp

今回は前回までのリストに続き、ユーザー定義関数を紹介します。

ユーザー定義関数

何度も同じ処理をするとき、その処理をひとつにまとめておいたほうが楽ですよね!!
その時には、ユーザー定義関数を使いましょう。(クラスについてはまた後日説明します。)

20歳未満なら"未成年"、そうでなければ"成年"と表示するユーザー定義関数を作ってみます。

def adult(age): 
    if age < 20:
        print("未成年")
    else:
        print("成年")

上記でadult という名前の関数を作りました。ageは引数といって、関数を実行するときに自由に設定できる値になります。

では実行してみましょう。

# 30を引数に入れてみます。
adult(30)

f:id:hanabusa-snow:20210917104415p:plain
引数が30なので"成人"と表示されました。

戻り値のあるユーザー定義関数

ユーザー定義関数は、結果として得られる戻り値というものがあります。
早速やってみましょう。

def adult(age):
    if age < 20:
        txt = "未成年"
    else:
        txt = "成年"
        
    return txt

今度は、printを使いませんでしたが、returnを用いています。
つまり、adultを実行すると、txtが値として戻されてくることになります。
実行してみましょう。

adult(10)

f:id:hanabusa-snow:20210917104943p:plain
このとおり、引数10に対して、"未成年"という結果が返されてきました。

以上、今回はここまでです。

【Python連載】リストを使った文字列操作-018-

www.pon-x.jp

前回の続きで今回はリストのちょっとした応用です。

文字列操作

自然言語処理を扱うときなど、文字列をハンドリングする機会があります。
今回はその基礎の基礎です。

区切り文字でリストにする

まず、スペース区切りでリストにしてみます。

s = "あ い う え お"

s.split()

f:id:hanabusa-snow:20210916112439p:plain

スペース以外ならsllitの中に区切り記号をいれてあげればOKです。

s = "あ,い,う,え,お"

s.split(",")

f:id:hanabusa-snow:20210916112528p:plain

逆に、リストを文字列にする

もちろん上記の逆も可能です。

l = ["あ", "い", "う", "え", "お"]

"".join(l)

f:id:hanabusa-snow:20210916112637p:plain

joinに引数を与えると区切り文字として挿入してくれます。

l = ["あ", "い", "う", "え", "お"]

",".join(l)

f:id:hanabusa-snow:20210916112726p:plain

注意!! 数値を連結する際は文字列に変換しましょう!!

# str で数値を文字列に変換する。

l = [1, 2, 3, 4, 5]
l = [str(i) for i in l]

",".join(l)

f:id:hanabusa-snow:20210916112821p:plain
数値のままだとエラーになるので気を付けましょう。

指定文字の除去

不要な文字を削除したい時は、けっこうな頻度であるのでぜひ覚えよう。
まずは、前後の文字列の削除

s= "-あいうえお-"

s.strip("-")

f:id:hanabusa-snow:20210916112946p:plain

stlipは前後の文字だけを対象にします。

# stripで除去できるのは前後の文字列のみ

s= "-あいう-えお-"

s.strip("-")

f:id:hanabusa-snow:20210916113024p:plain

全部取り除きたいときはreplaceを使うとよいです!!

s= "-あいうえお-"

s.replace("-","+")

f:id:hanabusa-snow:20210916113102p:plain

以上、今回はここまで