1/99スタックエンジニアの適当記録

適当なことを書きます。関西で転職したいです。

pythonのdef __str__(self)ってどういう意味?

今回は、pythonで頻出の__str__(self)の構文についてまとめてみました。
こんなレベルの記事を書くのもなんだかなーという気もするけれども、
一応新たに理解したことはアウトプットしておこうかなと思ってます。

djangoチュートリアルのこの部分を使います。
docs.djangoproject.com

polls/models.pyの部分に該当の表現が利用されています。

class Question(models.Model):
    # ...
    def __str__(self):
        return self.question_text

チュートリアルの説明にはこうあります。

あなた自身のインタラクティブシェルでの表示での利便性のためだけではなく、Djangoの自動生成adminでオブジェクトの表現として使用されるという理由からも __str__() メソッドをモデルに追加することは重要です。

全然文学的すぎてわかりません。

実際に変更してみる

コードを理解するには、実際に書いてみて、どのような結果が現れるのか見てみるのが手っ取り早いです。
このように変えてみました。

class Question(models.Model):
    # ...
    def __str__(self):
#        return self.question_text
        return "テスト20200208"

return部分をコメントアウトして、適当な文字列にしてみただけです。
もともと、このコードはmodels.に書かれたコードです。
このmodels.pyの挙動を見てみるのに、わかりやすい例として継承しているadmin.pyを使ってみます。
admin.pyはこのようになっています。

from django.contrib import admin
# Register your models here.
from django.contrib import admin
from .models import Question
admin.site.register(Question)

これを使ってdjnagoの管理画面がどのように変わったかを見てみます。
変更してみるとのQuestionの画面はこのようになりました。

f:id:roku28632:20200208160316p:plain

めちゃくちゃわかりやすいです。
すべてのレコード表記が適当に変更した文字列の「テスト20200208」になっています。
ちなみに、元に戻すとこんな感じです。

f:id:roku28632:20200208160336p:plain

どこが変わったのか一目瞭然ですね。

__str__(self)の意味

str()はclassを文字列で返すための関数です。
このclassを文字列で表現すると、こうなりますよ、ということに利用します。
また、このように、__str__アンダースコアが前後に2つついているのは、このstrがうんぬんかんぬんというよりは、pythonがアンダースコア2つを前後に持つ関数を「pythonがオブジェクトを扱う標準プロセスで使用することを目的に作られた特殊メゾット」
と定義しているからです。
誰かが作った関数ではなく、pythonが元から定義している特殊な関数だということを示しているわけです。
また、引数として渡しているselfは、「このオブジェクト自身」を表現します。
ここでいうと、Questionのclassの中でselfというのが出てきているので、Questionのオブジェクトを表現しているということになります。

まとめ

よって、まとめると、
__str__(self)は、「classのオブジェクトを文字列で表現するstrという特殊メソッドに、classのオブジェクト自身を表現するselfを引数として渡したもの」です。
他の人が読んで理解してもらえるか、あまり自身がありませんが、
自分の理解度が深まったので良しとします。