前提・実現したいこと
以下のコードの##########で区切られた所より下の部分で、
print('p1 < p2 =', p1 < p2)
TypeError: '<' not supported between instances of 'MITPerson' and 'MITPerson'
というエラーが出てきます。このソースコードは書籍から持ってきており、全く同じコードを書いています。
書籍では、##########で区切られた所より下の部分の結果は、
p1 < p2 = True
p3 < p2 = False
p4 < p1 = True
となるみたいです。
宜しくお願いします。
該当のソースコード
class Person(object): def __init__(self, name): """"「人間」を形成する""" self.name = name #selfにname(入力)を代入する try: lastBlank = name.rindex(' ') #lastBlankにnameの空白の後ろからの位置番号を代入 #rindex()は()を後ろから探したときの出現位置を返す self.lastName = name[lastBlank + 1:] #姓をself.lastNameに代入 except: #空白が見つからないとき self.lastName = name self.birthday = None #初期化 def getName(self): """selfの名前(フルネーム)を返す""" return self.name def getLastName(self): """selfの姓を返す""" return self.lastName def setBirthday(self, birthdate): """birthdateをdatetime.date型とする selfの生年月日をbirthdateと設定する""" self.birthday = birthdate def getAge(self): """selfの現在の年齢を日単位で返す""" if self.birthday==None: raise ValueError return (datetime.date.today() - self.birthday).days #今日の日付-誕生日 (.daysで日に換算) def __It__(self, other): """selfの名前がotherの名前と比べて アルファベット順で前ならばTrueを、 そうでなければFalseを返す 比較は、姓について行われるが、 姓が同じであれば名前(フルネーム)が比較される""" if self.lastName==other.lastName: #selfの姓がotherの姓とは同じ場合 return self.name < other.name #フルネームの比較に入る return self.lastName < other.lastName #selfの名前がotherの名前と比べてアルファベット順で前 def __str__(self): """selfの名前(フルネーム)を返す""" return self.name class MITPerson(Person): #属性の継承 nextIdNum = 0 #個人識別番号 def __init__(self, name): Person.__init__(self, name) #Personの中のinitを参照 self.idNum = MITPerson.nextIdNum #selfのidNumに、MITPersonのnextIdNumを代入する MITPerson.nextIdNum += 1 #MITPersonのnextIdNumを1増やす def getIdNum(self): return self.idNum def __It__(self, other): return self.idNum < other.idNum p1 = MITPerson('Barbara Beaver') #MITPersonの新しいインスタンスを作成 print(str(p1) + '\'s id number is ' + str(p1.getIdNum())) #まずはクラスMITPersonに関連づけられたメソッド__str__があるか調べる #存在しなければMITPersonのスーパークラスであるPersonに関連付けられた #これにより、self.nameとself.idNumの初期化が起こる #getIdNumがクラスMITPersonにあるか確かめる。(存在する) #MITPerson: Personのサブクラス #Person: MITPersonのスーパークラス ##################################################### p1 = MITPerson('Mark Guttag') p2 = MITPerson('Billy Bob Beaver') p3 = MITPerson('Billy Bob Beaver') p4 = Person('Billy Bob Beaver') print('p1 < p2 =', p1 < p2) print('p3 < p2 =', p3 < p2) print('p4 < p2 =', p4 < p2)
試したこと
print('p1 < p2 =', p1 < p2) を print('p1 < p2 =', str(p1) < str(p2))のように書き換えてみましたが、3つとも全てFalseを返し、上記の書籍に書いているような結果は得られませんでした。
補足情報(FW/ツールのバージョンなど)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/22 15:48
2018/11/22 15:51
2018/11/22 15:54