質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.63%

どうして'<' not supportedと出てくるのか分かりません。

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 670

epipy

score 17

 前提・実現したいこと

以下のコードの##########で区切られた所より下の部分で、
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/ツールのバージョンなど)

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

def __It__(self, other):
    ...

Itではなくltです。小文字のエルです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/23 00:48

    非常に初歩的なミスでした。
    迅速なご回答ありがとうございました!

    キャンセル

  • 2018/11/23 00:51

    じっくり観察してみると、メソッド名は全て小文字から始まっていることに気付くと思います。
    このような特徴に気付けるとミスを減らせます。

    キャンセル

  • 2018/11/23 00:54

    確かに、そのような特徴がありますね。
    今後に生かしたいと思います。ありがとうございます!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.63%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る