第118回【Python】コンストラクタ
現在取り組んでいるのは、paiza ラーニング問題集「クラス・構造体メニュー」になります。
はじめに
猫とキャンプと野球観戦と AWS が大好きな旦那、LeoSaki です。モフモフしたい。
Python をゼロから勉強してみよう、のコーナー 118 回目です。
クラスを扱うようになって、Python の方はなんとか最近の知識で書くことができるのですが、VBA は忘れていることも多く、調べ直すことが多くなりました。Python をゼロから勉強してみよう、だったはずが、VBA の方に時間がかかってしまっています。
それでは、今日も頑張ってみようと思います。
コンストラクタ
エンジニアのあなたの会社には、既に次のような社員クラス class employee が存在しています。
メンバ変数整数 number, 文字列 name
メンバ関数
getnumber(){
return number;
}
getname(){
return name;
}
現状、この社員クラスの全てのメンバ変数・メンバ関数を設定するためには、インスタンス名.変数名 = 変数
といった具合に直接代入をしなくてはなりません。
それは面倒なので、コンストラクタという機能を用いて、インスタンスを作成する際に インスタンス名 = new クラス名(number,name)
とすることでメンバ変数を設定できるように書き換えましょう。
入力で make number name
と入力された場合は各変数に number , name を持つ社員を作成し、getnum n
と入力された場合は n 番目に作成された社員の number を、getname n
と入力された場合は n 番目に作成された社員の name を出力してください。
N
S_1
...
S_N
・ 1 行目では、与えられる入力の回数 N が与えられます。
・続く N 行では、次のいずれかの形式の入力が与えられます。
・ make number name
・ getnum n
・ getname n
すべてのテストケースにおいて、以下の条件をみたします。
・ 1 ≦ N ≦ 10^5
・ 1 ≦ number ≦ 10^5
・ number , name は重複しない
・ name は長さ 20 文字未満の文字列
・ 1 ≦ n ≦ その入力時点での社員数
入力例
7
make 2742 mako
getnum 1
make 2782 taisei
getname 2
make 31 megumi
getname 1
getname 3
出力例
2742
taisei
mako
megumi
うーん、この問題は、前回の回答作成時にコンストラクタ(__init__)を用意していたので、特に変更する箇所はないです。VBA の場合は、コンストラクタ(Class_Initialize)に引数を渡せないので、別の方法を考える必要がありそうです。
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
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())
VBA
## class_primer__constructor
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 Get getnum()
getnum = emp.number
End Property
Property Get getname()
getname = emp.name
End Property
## 標準モジュール
Sub class_primer__make_class()
N = Cells(1, 1)
Dim cls() As New class_primer__constructor
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
End If
End If
Next
End Sub
最後に
前回取り組んだ問題とまったく変わりありません。
Python のコンストラクタは、当然のように書くものだと思い込んでいたので。ま、まぁ、コンストラクタ不要のクラスの場合もあるわけで、思い込みは捨てないとダメですね。
VBA のコンストラクタは、前回のまま Property Let で切り抜けましたが、コンストラクタと同様の働きをする Function を作った方がいいのでしょうか。自分の無知を思い知らされます。もっと勉強しなければ。
引き続き、よろしくお願いいたします!
ディスカッション
コメント一覧
まだ、コメントがありません