第117回【Python】クラスの作成

現在取り組んでいるのは、paiza ラーニング問題集「クラス・構造体メニュー」になります。

はじめに

猫とキャンプと野球観戦と AWS が大好きな旦那、LeoSaki です。モフモフしたい。

Python をゼロから勉強してみよう、のコーナー 117 回目です。

117 の電話番号が時報であるって今時の子は知っているんだろうか。アナログ時計が溢れていた頃は、時刻合わせにかけていたけれど、携帯やスマホが普及するにつれてかけることがなくなりました。電波時計なんて使っていると勝手に時刻合わせしてくれちゃいますしね。

それでは、今日も頑張ってみようと思います。

クラスの作成

エンジニアであり、社員を管理を管理する立場にあるあなたは、効率的に社員を管理するために、
各社員の社員番号 number と名前 name を持ち、加えて情報を返す関数を持つような構造体、すなわち次のようなメンバ変数とメンバ関数を持つ社員クラス class employee を作成することにしました。

メンバ変数

number : 整数
name : 文字列

メンバ関数

getnum(){
    return number;
}
getname(){
    return 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 ≦ 20
・ 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

学び始めた頃に似たようなことをやった記憶があるのではないでしょうか。オブジェクト指向ってこんな感じなんだ、と感動した気がする。10 年以上昔の話・・・。

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__make_class
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__make_class
    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

最後に

VBA で Property Let に複数の引数を渡す方法が分からず・・・。いろいろとネット情報を試して、なんとかできた方法がこれでした。正しいのかどうはか不明。

業務効率化のために VBA をご利用になられている方も多いと思います。VBA でもこういうことが出来るんだ、ということがどなたかの参考になれば幸いでございます。

引き続き、よろしくお願いいたします!

Pythonpaiza,学習,Python

Posted by LeoSaki