第119回【Python】クラスのメンバの更新
現在取り組んでいるのは、paiza ラーニング問題集「クラス・構造体メニュー」になります。
はじめに
猫とキャンプと野球観戦と AWS が大好きな旦那、LeoSaki です。モフモフしたい。
Python をゼロから勉強してみよう、のコーナー 119 回目です。
ルナちゃんは生まれて 1 年くらいの間、気づくと LeoSaki(旦那)の胸の上で寝ていました。時々思い出したように LeoSaki(旦那)の上に乗ってきます。さすがに重い。可愛いので許・・・せない。苦しい。
それでは、今日も頑張ってみようと思います。
クラスのメンバの更新
エンジニアであり、社員を管理を管理する立場にあるあなたの会社には、効率的に社員を管理するために、次のようなメンバ変数とメンバ関数を持つ社員クラス class employee
が存在しています。
メンバ変数整数 number, 文字列 name
メンバ関数
getnum(){
return number;
}
getname(){
return name;
}
しかし、この社員クラスについて、社員番号や名前が変わった際にいちいち手動で更新するのは面倒だと感じたあなたは、引数に元の社員番号と新しい社員番号を指定すれば、新しい社員番号に更新してくれる関数 change_num
と 引数に元の名前と新しい名前を指定すれば、新しい名前に更新してくれる関数 change_name
を作成することにしました。
入力で make number name
と入力された場合は変数にnumber, name
を持つ社員を作成し、getnum n
と入力された場合は n 番目に作成された社員の number を、getname n
と入力された場合は n 番目に作成された社員の name を出力してください。
また、 change_num n newnum
と入力された場合は、n 番目に作成された社員の number を、 newnum に変更し、 change_name n newname
と入力された場合は、n 番目に作成された社員の name を、 newname に変更してください。
N
S_1
...
S_N
・ 1 行目では、与えられる入力の回数 N が与えられます。
・ 続く N 行では、次のいずれかの形式の入力が与えられます。
・ make number name
・ getnum n
・ getname n
・ change_num n newnum
・ change_name n newname
すべてのテストケースにおいて、以下の条件をみたします。
・ 1 ≦ N ≦ 50
・ S_i (1 ≦ i ≦ N) の各形式の制約は次の通り
・ 1 ≦ number , newnum ≦ 10^5
・ どの時点においても number , name は重複しない
・ name , newname は長さ 20 文字未満の文字列
・ 1 ≦ n ≦ その入力時点での社員数
入力例
12
make 2742 makoto
getnum 1
make 2782 taro
getname 1
getname 2
change_num 2 9927
change_name 1 mako
getnum 2
make 31 meu
change_name 3 meumeu
getnum 3
getname 1
出力例
2742
makoto
taro
9927
31
mako
クラスを充実させていくパターン。大変勉強になります。
Python
class Employee:
def __init__(self,number,name):
self.number = number
self.name = name
def getnum(self):
return self.number
def getname(self):
return self.name
def change_num(self,newnum):
self.number = newnum
def change_name(self,newname):
self.name = newname
N = int(input())
employees = []
for _ in range(N):
S = input().split()
q = S[0]
if q == 'make':
number = int(S[1])
name = S[2]
employees.append(Employee(number,name))
else:
idx = int(S[1]) - 1
if q== 'getnum':
print(employees[idx].getnum())
elif q == 'getname':
print(employees[idx].getname())
elif q == 'change_num':
newnum = int(S[2])
employees[idx].change_num(newnum)
elif q == 'change_name':
newname = S[2]
employees[idx].change_name(newname)
VBA
## class_primer__change_member
Private emp As Employees
Private Type Employees
number As Long
name As String
End Type
Property Let employee(number, name)
emp.number = number
emp.name = name
End Property
Property Let change_num(newnum)
emp.number = newnum
End Property
Property Get getnum()
getnum = emp.number
End Property
Property Let change_name(newname)
emp.name = newname
End Property
Property Get getname()
getname = emp.name
End Property
## 標準モジュール
Sub class_primer__change_member()
N = Cells(1, 1)
Dim cls() As New class_primer__change_member
cls_cnt = 0
For i = 1 To N
S = Split(Cells(i + 1, 1), " ")
q = S(0)
If q = "make" Then
number = Val(S(1))
name = S(2)
ReDim Preserve cls(cls_cnt)
cls(cls_cnt).employee(number) = name
cls_cnt = cls_cnt + 1
Else
idx = Val(S(1)) - 1
If q = "getnum" Then
Debug.Print cls(idx).getnum
ElseIf q = "getname" Then
Debug.Print cls(idx).getname
ElseIf q = "change_num" Then
newnum = Val(S(2))
cls(idx).change_num = newnum
ElseIf q = "change_name" Then
newname = S(2)
cls(idx).change_name = newname
End If
End If
Next
End Sub
最後に
出来る限り、問題で指定されている変数に合わせる、その変数を作り面倒でも代入する、ということを心掛けています。最近は。そっちの方がわかりやすいですし。自分で見返したときにコレなんだっけ? ってならないように。
会社でも結構 VBA を利用した業務効率化ツールがあるのですが、クラスモジュールを利用しているものって少ないです。VBA でも結構いろんなことが出来ちゃうので、クラス化をご検討くださいませ。どなたかの参考になっていれば幸いです。
引き続き、よろしくお願いいたします!
ディスカッション
コメント一覧
まだ、コメントがありません