<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>演算子オーバーロード  |  Python-memo｜自動化・AI・Web開発の実験室</title>
	<atom:link href="https://python.cbagames.jp/tag/%e6%bc%94%e7%ae%97%e5%ad%90%e3%82%aa%e3%83%bc%e3%83%90%e3%83%bc%e3%83%ad%e3%83%bc%e3%83%89/feed/" rel="self" type="application/rss+xml" />
	<link>https://python.cbagames.jp</link>
	<description>Pythonで、できるをふやそう。</description>
	<lastBuildDate>Mon, 23 Jun 2025 03:08:55 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.1</generator>

<image>
	<url>https://python.cbagames.jp/wp-content/uploads/2025/06/cropped-497d491d54402de785c9e043bfa0620a-32x32.png</url>
	<title>演算子オーバーロード  |  Python-memo｜自動化・AI・Web開発の実験室</title>
	<link>https://python.cbagames.jp</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Pythonの特殊メソッドまとめ｜initやaddなど自作クラスを自由自在にカスタマイズ！</title>
		<link>https://python.cbagames.jp/2025/06/23/python-special-methods/</link>
					<comments>https://python.cbagames.jp/2025/06/23/python-special-methods/#respond</comments>
		
		<dc:creator><![CDATA[asukapy]]></dc:creator>
		<pubDate>Mon, 23 Jun 2025 03:08:54 +0000</pubDate>
				<category><![CDATA[クラス設計・OOP入門]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[カスタマイズ]]></category>
		<category><![CDATA[クラス定義]]></category>
		<category><![CDATA[初心者向け]]></category>
		<category><![CDATA[演算子オーバーロード]]></category>
		<category><![CDATA[特殊メソッド]]></category>
		<guid isPermaLink="false">https://python.cbagames.jp/?p=500</guid>

					<description><![CDATA[目次 はじめに1. 特殊メソッドとは？｜Pythonが裏で呼び出す“仕組み”特徴1：Pythonの構文に“連動”する特徴2：クラスに“人間らしい”振る舞いを与えられる2. 算術演算子のカスタマイズ｜__add__や__s [&#8230;]]]></description>
										<content:encoded><![CDATA[

  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2"><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">はじめに</a></li><li><a href="#toc2" tabindex="0">1. 特殊メソッドとは？｜Pythonが裏で呼び出す“仕組み”</a><ol><li><a href="#toc3" tabindex="0">特徴1：Pythonの構文に“連動”する</a></li><li><a href="#toc4" tabindex="0">特徴2：クラスに“人間らしい”振る舞いを与えられる</a></li></ol></li><li><a href="#toc5" tabindex="0">2. 算術演算子のカスタマイズ｜__add__や__sub__</a><ol><li><a href="#toc6" tabindex="0">__add__を使って「+」を使えるようにする</a></li><li><a href="#toc7" tabindex="0">右側に対応する__radd__</a></li><li><a href="#toc8" tabindex="0">その他の算術演算子にも対応できる</a></li><li><a href="#toc9" tabindex="0">どんなときに使うの？</a></li></ol></li><li><a href="#toc10" tabindex="0">3. インスタンス生成の制御｜__new__と__init__</a><ol><li><a href="#toc11" tabindex="0">__new__と__init__の違いは？</a></li><li><a href="#toc12" tabindex="0">どんなときに使うの？</a></li><li><a href="#toc13" tabindex="0">__new__の基本構文と例</a></li><li><a href="#toc14" tabindex="0">__new__を使うときの注意点</a></li></ol></li><li><a href="#toc15" tabindex="0">4. 比較演算子の定義｜__eq__や__lt__</a><ol><li><a href="#toc16" tabindex="0">__eq__で「==」の挙動を定義する</a></li><li><a href="#toc17" tabindex="0">NotImplementedを返すとどうなる？</a></li><li><a href="#toc18" tabindex="0">&lt;や&gt;を使うには？ __lt__, __gt__の出番</a></li><li><a href="#toc19" tabindex="0">functools.total_orderingでまとめて実装</a></li></ol></li><li><a href="#toc20" tabindex="0">5. []を使いたい！｜__getitem__と__setitem__</a><ol><li><a href="#toc21" tabindex="0">__getitem__｜値の取得に対応する</a></li><li><a href="#toc22" tabindex="0">__setitem__｜値の設定に対応する</a></li><li><a href="#toc23" tabindex="0">応用例：インデックスでアクセスする</a></li><li><a href="#toc24" tabindex="0">よく使われる場面</a></li></ol></li><li><a href="#toc25" tabindex="0">6. 表示や変換をカスタマイズ｜__str__や__int__</a><ol><li><a href="#toc26" tabindex="0">__str__｜printしたときの見た目を整える</a></li><li><a href="#toc27" tabindex="0">__repr__との違いは？</a></li><li><a href="#toc28" tabindex="0">__int__｜int()で整数変換できるようにする</a></li><li><a href="#toc29" tabindex="0">__float__｜float()での変換も可能</a></li><li><a href="#toc30" tabindex="0">表示や変換のカスタマイズは「親しみやすさ」に直結</a></li></ol></li><li><a href="#toc31" tabindex="0">まとめ｜特殊メソッドを知ると、自作クラスがもっと楽しくなる！</a><ol><li><a href="#toc32" tabindex="0">👇 この記事で紹介した特殊メソッドの使いどころをおさらい！</a></li><li><a href="#toc33" tabindex="0">あわせて読みたい</a></li></ol></li><li><a href="#toc34" tabindex="0">よくある質問（Q&amp;A）</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">はじめに</span></h2>



<p>Pythonでクラスを使い始めると、最初は<code>__init__</code>や<code>self</code>といった基本的な仕組みだけで十分かもしれません。でも、使っていくうちに「オブジェクト同士を足せたらいいのに」とか、「printしたときに見やすく表示できたら便利だな」と思ったことはありませんか？</p>



<p>実は、Pythonにはそういった<strong>クラスの振る舞いを自由にカスタマイズできる“裏技”のような仕組み</strong>が用意されています。それが「<strong>特殊メソッド</strong>」です！</p>



<p>特殊メソッドは、名前が<code>__xxx__</code>のように<strong>アンダースコアで挟まれた特別なメソッド</strong>で、Pythonの内部で特定のタイミングに自動で呼び出されます。たとえば、オブジェクトを生成したときに呼ばれる<code>__init__</code>や、<code>+</code>演算子の処理を担う<code>__add__</code>などがそれにあたります。</p>



<p>この仕組みを理解すれば、自作のクラスに「+」や「==」などの演算子を使えるようにしたり、<code>print()</code>でわかりやすく表示したり、辞書みたいに<code>obj["key"]</code>でアクセスしたりと、**まるで標準ライブラリのような“自然な使い心地”**を実現できます。</p>



<p>この記事では、そんな特殊メソッドの中から<strong>特に使いやすくて便利なものを厳選して紹介</strong>します。Pythonのクラス設計をさらにパワーアップさせたい方は、ぜひ参考にしてみてください！</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>


<p><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2494518121553371"
     crossorigin="anonymous"></script><br />
<ins class="adsbygoogle"
     style="display:block; text-align:center;"
     data-ad-layout="in-article"
     data-ad-format="fluid"
     data-ad-client="ca-pub-2494518121553371"
     data-ad-slot="2936039508"></ins><br />
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script></p>



<h2 class="wp-block-heading"><span id="toc2">1. 特殊メソッドとは？｜Pythonが裏で呼び出す“仕組み”</span></h2>



<p>Pythonには、<code>__init__</code>や<code>__str__</code>のように<strong>名前の前後にアンダースコア（_）が2つ付いたメソッド</strong>があります。これらは「<strong>特殊メソッド（Special Method）</strong>」や「<strong>マジックメソッド（Magic Method）</strong>」と呼ばれ、Pythonの<strong>言語仕様によって自動的に呼び出される仕組み</strong>になっています。</p>



<p>たとえば次のような場面を思い出してください。</p>



<pre class="wp-block-preformatted"><code>print("Hello")<br></code></pre>



<p>このとき、実はPythonの中では次のような処理が行われています。</p>



<pre class="wp-block-preformatted"><code>"Hello".__str__()<br></code></pre>



<p>つまり、<code>print()</code>で文字列を表示するときは、文字列オブジェクトの<code>__str__()</code>という特殊メソッドが呼び出されているのです。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc3">特徴1：Pythonの構文に“連動”する</span></h3>



<p>特殊メソッドの最大の特徴は、<strong>Pythonの構文や演算子とセットで使われる</strong>という点です。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>構文／演算子</th><th>呼ばれる特殊メソッド</th></tr></thead><tbody><tr><td><code>+</code></td><td><code>__add__()</code></td></tr><tr><td><code>==</code></td><td><code>__eq__()</code></td></tr><tr><td><code>print(obj)</code></td><td><code>__str__()</code></td></tr><tr><td><code>obj[key]</code></td><td><code>__getitem__()</code></td></tr><tr><td><code>obj[key] = x</code></td><td><code>__setitem__()</code></td></tr></tbody></table></figure>



<p>これらは、自作クラスで定義しておくと、Pythonの標準的な操作に<strong>自然になじむような挙動</strong>を持たせることができます。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc4">特徴2：クラスに“人間らしい”振る舞いを与えられる</span></h3>



<p>普通にクラスを定義するだけでは、演算子や関数との連携ができません。でも、特殊メソッドを使えば：</p>



<ul class="wp-block-list">
<li><code>+</code> で自作のオブジェクト同士を合成</li>



<li><code>==</code> で内容が一致するかを比較</li>



<li><code>print()</code> で見やすく表示</li>



<li><code>[]</code> で辞書のようにアクセス</li>
</ul>



<p>など、人が直感的に使いやすい機能を<strong>クラスに持たせることが可能</strong>になります。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://python.cbagames.jp/wp-content/uploads/2025/06/9d9697ea94c9608a27d0bde31599ba86-150x150.jpg" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>Pythonのクラスは、特殊メソッドがなくても普通に使えます。でも、これを知っておくと一気にクラス設計の幅が広がります。たとえば、データ分析用のオブジェクト、ゲームのキャラクタークラス、数式を扱うクラスなど、<strong>現実世界の動作をプログラムに“自然に”落とし込む</strong>ことができます。</p>
</div></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>


<p><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2494518121553371"
     crossorigin="anonymous"></script><br />
<ins class="adsbygoogle"
     style="display:block; text-align:center;"
     data-ad-layout="in-article"
     data-ad-format="fluid"
     data-ad-client="ca-pub-2494518121553371"
     data-ad-slot="2936039508"></ins><br />
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script></p>



<h2 class="wp-block-heading"><span id="toc5">2. 算術演算子のカスタマイズ｜__add__や__sub__</span></h2>



<p>Pythonでは、数値に対して<code>+</code>や<code>-</code>を使うのは当たり前ですよね。でも実は、<strong>自分で作ったクラスにも同じような演算子の使い方をさせることができる</strong>んです。</p>



<p>その秘密が、<strong>特殊メソッド <code>__add__</code> や <code>__sub__</code></strong> にあります。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc6">__add__を使って「+」を使えるようにする</span></h3>



<p>まずは例から見てみましょう。次のようなクラスがあるとします。</p>



<pre class="wp-block-preformatted"><code>class Point:<br>    def __init__(self, x, y):<br>        self.x = x<br>        self.y = y<br></code></pre>



<p>このままでは、<code>p1 + p2</code>のように2つのPointオブジェクトを足そうとすると、エラーになります。でも、<code>__add__</code>メソッドを追加すると……？</p>



<pre class="wp-block-preformatted"><code>class Point:<br>    def __init__(self, x, y):<br>        self.x = x<br>        self.y = y<br><br>    def __add__(self, other):<br>        return Point(self.x + other.x, self.y + other.y)<br></code></pre>



<p>こうすることで、次のように書けるようになります。</p>



<pre class="wp-block-preformatted"><code>p1 = Point(3, 5)<br>p2 = Point(2, 4)<br>p3 = p1 + p2  # ← __add__が自動で呼ばれる！<br><br>print(p3.x, p3.y)  # 結果：5 9<br></code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc7">右側に対応する__radd__</span></h3>



<p>通常、<code>p1 + p2</code>では左側（p1）の<code>__add__()</code>が使われます。でも、もし左側のオブジェクトがその演算に対応していなかったら、Pythonは**右側の<code>__radd__()</code>**を探してくれます。</p>



<pre class="wp-block-preformatted"><code>def __radd__(self, other):<br>    # 右側からの加算に対応<br>    return self.__add__(other)<br></code></pre>



<p>この仕組みは、異なる型のオブジェクト同士を足し算したいときにも便利です。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc8">その他の算術演算子にも対応できる</span></h3>



<p>Pythonには他にもいろんな演算子があり、それぞれに対応する特殊メソッドがあります。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>演算子</th><th>特殊メソッド</th></tr></thead><tbody><tr><td><code>-</code></td><td><code>__sub__()</code></td></tr><tr><td><code>*</code></td><td><code>__mul__()</code></td></tr><tr><td><code>/</code></td><td><code>__truediv__()</code></td></tr><tr><td><code>//</code></td><td><code>__floordiv__()</code></td></tr><tr><td><code>%</code></td><td><code>__mod__()</code></td></tr><tr><td><code>**</code></td><td><code>__pow__()</code></td></tr></tbody></table></figure>



<p>これらを定義すれば、<strong>まるで数値と同じような自然な操作ができるクラス</strong>を作ることができます。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc9">どんなときに使うの？</span></h3>



<ul class="wp-block-list">
<li>ベクトルや座標の計算を行うクラス</li>



<li>金額や通貨を扱うクラス</li>



<li>データ集計用のオブジェクト</li>
</ul>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://python.cbagames.jp/wp-content/uploads/2025/06/9d9697ea94c9608a27d0bde31599ba86-150x150.jpg" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>たとえば、NumPyの配列やPandasのデータフレームでもこのような特殊メソッドが活用されています。自分のクラスに“+”や“-”を使いたいと思ったら、ぜひ<code>__add__</code>や<code>__sub__</code>を試してみましょう！</p>
</div></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>


<p><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2494518121553371"
     crossorigin="anonymous"></script><br />
<ins class="adsbygoogle"
     style="display:block; text-align:center;"
     data-ad-layout="in-article"
     data-ad-format="fluid"
     data-ad-client="ca-pub-2494518121553371"
     data-ad-slot="2936039508"></ins><br />
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script></p>



<h2 class="wp-block-heading"><span id="toc10">3. インスタンス生成の制御｜__new__と__init__</span></h2>



<p>Pythonでクラスのインスタンスを作るとき、ふつうは<code>__init__</code>メソッドを使いますよね。たとえばこんな感じです：</p>



<pre class="wp-block-preformatted"><code>class Person:<br>    def __init__(self, name):<br>        self.name = name<br><br>p = Person("Alice")  # __init__が呼ばれる<br></code></pre>



<p>この<code>__init__</code>は、「インスタンスが作られたあとに<strong>中身を初期化する</strong>」ためのメソッドです。でも実は、<strong>インスタンスを「作る」処理自体をカスタマイズできるもう一つの特殊メソッド</strong>があるんです。それが、<code>__new__</code>です。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc11">__new__と__init__の違いは？</span></h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>メソッド</th><th>タイミング</th><th>主な役割</th></tr></thead><tbody><tr><td><code>__new__</code></td><td>インスタンスを<strong>作る前</strong></td><td>インスタンスを<strong>生成して返す</strong></td></tr><tr><td><code>__init__</code></td><td>インスタンスを<strong>作った後</strong></td><td>インスタンスを<strong>初期化する</strong></td></tr></tbody></table></figure>



<p><code>__new__</code>は、インスタンスそのものを作るタイミングで呼び出されるので、戻り値として<strong>作ったインスタンスを返す必要があります</strong>。この戻り値がないと、<code>__init__</code>も呼ばれません。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc12">どんなときに使うの？</span></h3>



<p><code>__new__</code>を使うのは珍しいですが、次のようなケースで必要になります。</p>



<ul class="wp-block-list">
<li><code>int</code> や <code>str</code> などの <strong>イミュータブル（変更できない）な型</strong>を継承するとき</li>



<li>インスタンス生成の前に何か特殊な処理をしたいとき</li>



<li><strong>シングルトンパターン</strong>など、1つしかインスタンスを作らせたくない設計をしたいとき</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc13">__new__の基本構文と例</span></h3>



<pre class="wp-block-preformatted"><code>class CustomStr(str):<br>    def __new__(cls, value):<br>        print("CustomStr.__new__ called")<br>        obj = super().__new__(cls, value.upper())<br>        return obj<br><br>s = CustomStr("hello")<br>print(s)  # 出力：HELLO<br></code></pre>



<p>このコードでは、<code>str</code>を継承したカスタムクラスで、文字列を大文字に変換してからインスタンスを作っています。<code>str</code>はイミュータブルなので、<code>__init__</code>では値を変えられません。だからこそ、<code>__new__</code>で加工する必要があるんです。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc14">__new__を使うときの注意点</span></h3>



<ul class="wp-block-list">
<li><code>__new__</code>の**第1引数は<code>self</code>ではなく<code>cls</code>**になります（クラス自体を受け取る）。</li>



<li><code>super().__new__(cls, ...)</code>のように、親クラスの<code>__new__</code>を呼び出して<strong>インスタンスを生成する必要</strong>があります。</li>



<li>インスタンスを返すのを忘れると、<code>__init__</code>が呼ばれずエラーになります。</li>
</ul>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://python.cbagames.jp/wp-content/uploads/2025/06/9d9697ea94c9608a27d0bde31599ba86-150x150.jpg" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>ふだんは<code>__init__</code>だけで十分ですが、ちょっと高度なことをしたくなったら、<code>__new__</code>を思い出してみてください。インスタンス生成の流れを完全にコントロールできるようになりますよ！</p>
</div></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>


<p><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2494518121553371"
     crossorigin="anonymous"></script><br />
<ins class="adsbygoogle"
     style="display:block; text-align:center;"
     data-ad-layout="in-article"
     data-ad-format="fluid"
     data-ad-client="ca-pub-2494518121553371"
     data-ad-slot="2936039508"></ins><br />
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script></p>



<h2 class="wp-block-heading"><span id="toc15">4. 比較演算子の定義｜__eq__や__lt__</span></h2>



<p>Pythonでオブジェクト同士を<code>==</code>や<code>&lt;</code>で比較できたら便利ですよね。自作クラスでも、それを実現できるのが<strong>比較演算子に対応した特殊メソッド</strong>です。</p>



<p>このセクションでは、よく使われる以下のメソッドを紹介します：</p>



<ul class="wp-block-list">
<li><code>__eq__</code>（==）</li>



<li><code>__ne__</code>（!=）</li>



<li><code>__lt__</code>（&lt;）</li>



<li><code>__le__</code>（&lt;=）</li>



<li><code>__gt__</code>（>）</li>



<li><code>__ge__</code>（>=）</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc16">__eq__で「==」の挙動を定義する</span></h3>



<p>たとえば、2つの<code>Book</code>オブジェクトが「同じタイトルと著者を持っていたら等しい」としたい場合、こんなふうに書きます：</p>



<pre class="wp-block-preformatted"><code>class Book:<br>    def __init__(self, title, author):<br>        self.title = title<br>        self.author = author<br><br>    def __eq__(self, other):<br>        return (self.title == other.title) and (self.author == other.author)<br></code></pre>



<p>このように定義すれば、次のような比較ができます：</p>



<pre class="wp-block-preformatted"><code>book1 = Book("Python入門", "山田")<br>book2 = Book("Python入門", "山田")<br>book3 = Book("Python応用", "佐藤")<br><br>print(book1 == book2)  # True<br>print(book1 == book3)  # False<br></code></pre>



<p>Pythonは<code>book1 == book2</code>と書かれた時、<strong>自動で<code>book1.__eq__(book2)</code>を呼び出してくれる</strong>んです。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc17">NotImplementedを返すとどうなる？</span></h3>



<p>比較対象の型が明らかに違う場合、比較できないことを示すために<code>NotImplemented</code>を返すこともできます。</p>



<pre class="wp-block-preformatted"><code>def __eq__(self, other):<br>    if not isinstance(other, Book):<br>        return NotImplemented<br>    return self.title == other.title and self.author == other.author<br></code></pre>



<p>このように書くと、<code>Book</code>と無関係なオブジェクトと比較しても安全です。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc18">&lt;や&gt;を使うには？ __lt__, __gt__の出番</span></h3>



<p>順位づけが必要なクラス（例：テストの点数、ランキング、価格など）では、大小比較もしたくなりますよね。</p>



<pre class="wp-block-preformatted"><code>class Score:<br>    def __init__(self, name, value):<br>        self.name = name<br>        self.value = value<br><br>    def __lt__(self, other):<br>        return self.value &lt; other.value<br></code></pre>



<p>これで次のように使えます：</p>



<pre class="wp-block-preformatted"><code>s1 = Score("Aさん", 85)<br>s2 = Score("Bさん", 92)<br><br>print(s1 &lt; s2)  # True<br></code></pre>



<p>さらに<code>__gt__</code>（大なり）、<code>__le__</code>（以下）、<code>__ge__</code>（以上）なども定義しておけば、<strong>ソート（並び替え）にも対応できます</strong>。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc19">functools.total_orderingでまとめて実装</span></h3>



<p>すべての比較メソッドを書くのは面倒…というときは、<code>@total_ordering</code>デコレーターを使うと便利です！</p>



<pre class="wp-block-preformatted"><code>from functools import total_ordering<br><br>@total_ordering<br>class Score:<br>    def __init__(self, name, value):<br>        self.name = name<br>        self.value = value<br><br>    def __eq__(self, other):<br>        return self.value == other.value<br><br>    def __lt__(self, other):<br>        return self.value &lt; other.value<br></code></pre>



<p>このように**<code>__eq__</code>と<code>__lt__</code>だけ定義すれば、残りは自動で補完してくれます。**</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://python.cbagames.jp/wp-content/uploads/2025/06/9d9697ea94c9608a27d0bde31599ba86-150x150.jpg" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>自作クラスで比較ができるようになると、リストの中での検索や並び替え、重複チェックなどがグッと使いやすくなります。ぜひ活用してみてください！</p>
</div></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>


<p><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2494518121553371"
     crossorigin="anonymous"></script><br />
<ins class="adsbygoogle"
     style="display:block; text-align:center;"
     data-ad-layout="in-article"
     data-ad-format="fluid"
     data-ad-client="ca-pub-2494518121553371"
     data-ad-slot="2936039508"></ins><br />
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script></p>



<h2 class="wp-block-heading"><span id="toc20">5. []を使いたい！｜__getitem__と__setitem__</span></h2>



<p>Pythonでは、リストや辞書のように<code>[]</code>（角括弧）を使ってデータにアクセスしたり、値を代入したりできますよね。</p>



<pre class="wp-block-preformatted"><code>d = {"key": "value"}<br>print(d["key"])  # → "value"<br>d["key"] = "new value"<br></code></pre>



<p>実はこの挙動、すべて<strong>特殊メソッド <code>__getitem__</code> と <code>__setitem__</code> によって制御されている</strong>んです。そして、自作クラスでもこれらを定義すれば、<strong>まるで辞書や配列のように扱えるオブジェクト</strong>を作ることができます。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc21">__getitem__｜値の取得に対応する</span></h3>



<p>まずは「値を取り出す」動作から見ていきましょう。</p>



<pre class="wp-block-preformatted"><code>class MyBox:<br>    def __init__(self):<br>        self.data = {"a": 1, "b": 2}<br><br>    def __getitem__(self, key):<br>        return self.data[key]<br></code></pre>



<p>使い方はとってもシンプル：</p>



<pre class="wp-block-preformatted"><code>box = MyBox()<br>print(box["a"])  # 出力：1<br></code></pre>



<p>このとき、<code>box["a"]</code>と書くと、自動的に<code>box.__getitem__("a")</code>が呼ばれます。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc22">__setitem__｜値の設定に対応する</span></h3>



<p>続いて、値を代入するには<code>__setitem__</code>を使います。</p>



<pre class="wp-block-preformatted"><code>class MyBox:<br>    def __init__(self):<br>        self.data = {}<br><br>    def __getitem__(self, key):<br>        return self.data[key]<br><br>    def __setitem__(self, key, value):<br>        self.data[key] = value<br></code></pre>



<p>これで次のように書けます：</p>



<pre class="wp-block-preformatted"><code>box = MyBox()<br>box["x"] = 100<br>print(box["x"])  # 出力：100<br></code></pre>



<p>Pythonの辞書と同じような操作が、自作クラスで再現できていますね！</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc23">応用例：インデックスでアクセスする</span></h3>



<p>キーだけでなく、<strong>数値インデックスで配列のようにアクセス</strong>することも可能です。</p>



<pre class="wp-block-preformatted"><code>class NumberList:<br>    def __init__(self, values):<br>        self.values = values<br><br>    def __getitem__(self, index):<br>        return self.values[index]<br><br>    def __setitem__(self, index, value):<br>        self.values[index] = value<br></code></pre>



<p>使い方はこんな感じ：</p>



<pre class="wp-block-preformatted"><code>nums = NumberList([10, 20, 30])<br>print(nums[1])   # 出力：20<br>nums[1] = 99<br>print(nums[1])   # 出力：99<br></code></pre>



<p>このように、<strong><code>[]</code>による直感的なアクセス</strong>が自作クラスでも使えるようになると、コードがグッと読みやすく、扱いやすくなります。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc24">よく使われる場面</span></h3>



<ul class="wp-block-list">
<li>データ構造（リスト、スタック、辞書など）を自作するとき</li>



<li>行列や座標などの数値データ操作</li>



<li>クラスの内部状態に簡単にアクセスしたいとき</li>
</ul>



<p>Pandasの<code>DataFrame</code>やNumPyの<code>ndarray</code>でも、この仕組みが使われています。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://python.cbagames.jp/wp-content/uploads/2025/06/9d9697ea94c9608a27d0bde31599ba86-150x150.jpg" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>角括弧でのアクセスは、ユーザーにとって非常に「自然な操作」です。それを自作クラスにも取り入れることで、<strong>より“Pythonらしい”オブジェクト設計</strong>ができるようになります！</p>
</div></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>


<p><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2494518121553371"
     crossorigin="anonymous"></script><br />
<ins class="adsbygoogle"
     style="display:block; text-align:center;"
     data-ad-layout="in-article"
     data-ad-format="fluid"
     data-ad-client="ca-pub-2494518121553371"
     data-ad-slot="2936039508"></ins><br />
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script></p>



<h2 class="wp-block-heading"><span id="toc25">6. 表示や変換をカスタマイズ｜__str__や__int__</span></h2>



<p>Pythonでは、オブジェクトを<code>print()</code>したり、<code>str()</code>や<code>int()</code>などの関数で変換したりすることがありますよね。自作クラスでも、これらの動作を<strong>自由にカスタマイズ</strong>できるんです。</p>



<p>それを実現するのが、次のような特殊メソッドたちです：</p>



<ul class="wp-block-list">
<li><code>__str__</code>（<code>print()</code>や<code>str()</code>で表示するときの文字列）</li>



<li><code>__repr__</code>（開発者向けの表示。省略可）</li>



<li><code>__int__</code>（<code>int()</code>で整数に変換するとき）</li>



<li><code>__float__</code>（<code>float()</code>で小数に変換するとき）</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc26">__str__｜printしたときの見た目を整える</span></h3>



<p>まずは基本中の基本、<code>__str__</code>です。</p>



<pre class="wp-block-preformatted"><code>class User:<br>    def __init__(self, name, age):<br>        self.name = name<br>        self.age = age<br><br>    def __str__(self):<br>        return f"{self.name}（{self.age}歳）"<br></code></pre>



<p>使ってみましょう：</p>



<pre class="wp-block-preformatted"><code>user = User("たろう", 30)<br>print(user)  # 出力：たろう（30歳）<br></code></pre>



<p>このように、<code>print()</code>で表示される文字列を自由に決められます。デバッグやログ出力でも役立ちますね！</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc27">__repr__との違いは？</span></h3>



<p><code>__repr__</code>は、**開発者向けの“再現可能な文字列”**を返すことが推奨されています。</p>



<pre class="wp-block-preformatted"><code>def __repr__(self):<br>    return f"User('{self.name}', {self.age})"<br></code></pre>



<p>これは、<code>print()</code>では使われませんが、インタラクティブシェルなどでオブジェクトをそのまま表示したときに使われます。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc28">__int__｜int()で整数変換できるようにする</span></h3>



<p>数値っぽいクラスには、<code>int()</code>や<code>float()</code>の挙動を持たせることもできます。</p>



<pre class="wp-block-preformatted"><code>class Price:<br>    def __init__(self, yen):<br>        self.yen = yen<br><br>    def __int__(self):<br>        return self.yen<br></code></pre>



<p>こうすると：</p>



<pre class="wp-block-preformatted"><code>p = Price(980)<br>print(int(p))  # 出力：980<br></code></pre>



<p>つまり、自作クラスを<strong>数値としても使える</strong>ようになるということです。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc29">__float__｜float()での変換も可能</span></h3>



<p>上と同じように、<code>__float__</code>を使えば小数への変換にも対応できます。</p>



<pre class="wp-block-preformatted"><code>def __float__(self):<br>    return float(self.yen)<br></code></pre>



<p>これを定義すれば、<code>float(obj)</code>と書いたときにも好きな値を返せます。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc30">表示や変換のカスタマイズは「親しみやすさ」に直結</span></h3>



<p>自作クラスがあまりに“無機質”な表示だと、使う側にとってわかりづらくなってしまいます。でも、<code>__str__</code>や<code>__int__</code>などをしっかり定義しておけば、</p>



<ul class="wp-block-list">
<li><strong>printで見やすい</strong></li>



<li><strong>ログに出しても意味が通じる</strong></li>



<li><strong>変換も簡単</strong></li>
</ul>



<p>といった具合に、クラスがぐっと「人にやさしい」設計になります。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://python.cbagames.jp/wp-content/uploads/2025/06/9d9697ea94c9608a27d0bde31599ba86-150x150.jpg" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>これで、特殊メソッドを活用した主要なクラスカスタマイズ方法はひと通りカバーできました。</p>
</div></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>


<p><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2494518121553371"
     crossorigin="anonymous"></script><br />
<ins class="adsbygoogle"
     style="display:block; text-align:center;"
     data-ad-layout="in-article"
     data-ad-format="fluid"
     data-ad-client="ca-pub-2494518121553371"
     data-ad-slot="2936039508"></ins><br />
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script></p>



<h2 class="wp-block-heading"><span id="toc31">まとめ｜特殊メソッドを知ると、自作クラスがもっと楽しくなる！</span></h2>



<p>この記事では、Pythonの**特殊メソッド（マジックメソッド）**について、初心者でもわかりやすく解説してきました。</p>



<p>特殊メソッドは、<code>__init__</code>や<code>__str__</code>をはじめとする「アンダースコア2つ」で囲まれた特別な名前を持つメソッドで、<strong>Pythonが裏側で自動的に呼び出してくれる便利な仕組み</strong>です。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc32">👇 この記事で紹介した特殊メソッドの使いどころをおさらい！</span></h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>メソッド</th><th>主な役割</th></tr></thead><tbody><tr><td><code>__add__</code>, <code>__sub__</code></td><td><code>+</code>や<code>-</code>などの演算子をカスタマイズ</td></tr><tr><td><code>__new__</code>, <code>__init__</code></td><td>インスタンスの生成と初期化</td></tr><tr><td><code>__eq__</code>, <code>__lt__</code>など</td><td>オブジェクトの比較（==、&lt;など）</td></tr><tr><td><code>__getitem__</code>, <code>__setitem__</code></td><td><code>[]</code>でのアクセスや代入を実現</td></tr><tr><td><code>__str__</code>, <code>__int__</code>, <code>__float__</code></td><td>表示や型変換の振る舞いを定義</td></tr></tbody></table></figure>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://python.cbagames.jp/wp-content/uploads/2025/06/9d9697ea94c9608a27d0bde31599ba86-150x150.jpg" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>これらを活用すれば、自作クラスに「人間らしい使い方」を与えることができ、コードがもっと直感的で読みやすくなります。</p>



<p>はじめのうちは<code>__str__</code>や<code>__eq__</code>あたりから、少しずつ試していくのがおすすめです。<br>慣れてきたら、演算や<code>[]</code>の操作もカスタマイズして、あなただけの便利なクラス設計にチャレンジしてみてください！</p>
</div></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc33">あわせて読みたい</span></h3>



<p>特殊メソッドを理解したら、Pythonのクラス設計やオブジェクト指向の基礎もあわせてチェックしておきましょう！</p>



<ul class="wp-block-list">
<li>🔰 <a target="_blank" href="https://python.cbagames.jp/2025/06/13/python-class-basic/">初心者でもすぐわかる！Pythonのクラス入門ガイド｜オブジェクト指向をやさしく解説</a><br>　クラスってなに？から始める超入門ガイド。selfや<code>__init__</code>の使い方も詳しく解説！</li>



<li>🛠️ <a target="_blank" href="https://python.cbagames.jp/2025/06/17/python-property-decorator/">Pythonの@propertyデコレーターとは？getter・setterの使い方をわかりやすく解説！</a><br>　属性の制御をスマートに！外から見えるけど中でチェックする、プロパティ活用術。</li>



<li>🌀 <a target="_blank" href="https://python.cbagames.jp/2025/06/15/python-decorator-beginner-guide/">【Python入門】デコレーターの使い方と仕組みを初心者向けにやさしく解説！</a><br>　関数やメソッドに“追加機能”を後付けできる便利なテクニック。特殊メソッドと合わせて学びたい！</li>



<li>🧩 <a target="_blank" href="https://python.cbagames.jp/2025/06/21/python-mixin-class/">PythonのMixinクラスとは？複数継承を活かした再利用設計</a><br>　コードをもっと再利用したい人に。クラス設計の柔軟性が広がります。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc34">よくある質問（Q&amp;A）</span></h2>



<div class="wp-block-cocoon-blocks-faq faq-wrap blank-box block-box not-nested-style cocoon-block-faq"><dl class="faq"><dt class="faq-question faq-item"><div class="faq-question-label faq-item-label">Q</div><div class="faq-question-content faq-item-content">特殊メソッドって、自分で直接呼び出してもいいの？</div></dt><dd class="faq-answer faq-item"><div class="faq-answer-label faq-item-label">A</div><div class="faq-answer-content faq-item-content">
<p>可能ではありますが、基本的にはPythonの構文（<code>+</code>、<code>==</code>、<code>[]</code>、<code>print()</code>など）によって<strong>自動的に呼び出される</strong>ものです。直接<code>obj.__add__(other)</code>のように書くこともできますが、コードの可読性が下がるため、通常は演算子や関数を使ったほうが自然です。</p>
</div></dd></dl></div>



<div class="wp-block-cocoon-blocks-faq faq-wrap blank-box block-box not-nested-style cocoon-block-faq"><dl class="faq"><dt class="faq-question faq-item"><div class="faq-question-label faq-item-label">Q</div><div class="faq-question-content faq-item-content">すべての特殊メソッドを実装しないといけないの？</div></dt><dd class="faq-answer faq-item"><div class="faq-answer-label faq-item-label">A</div><div class="faq-answer-content faq-item-content">
<p>いいえ、必要なものだけを実装すれば大丈夫です。たとえば、数値同士の加算をしたいだけなら<code>__add__</code>だけで十分ですし、表示を整えたいなら<code>__str__</code>だけ書けばOKです。</p>
</div></dd></dl></div>



<div class="wp-block-cocoon-blocks-faq faq-wrap blank-box block-box not-nested-style cocoon-block-faq"><dl class="faq"><dt class="faq-question faq-item"><div class="faq-question-label faq-item-label">Q</div><div class="faq-question-content faq-item-content"><code>__repr__</code>と<code>__str__</code>はどう違うの？</div></dt><dd class="faq-answer faq-item"><div class="faq-answer-label faq-item-label">A</div><div class="faq-answer-content faq-item-content">
<p><code>__str__</code>は主に<strong>ユーザー向けの見やすい表示</strong>、<code>__repr__</code>は**開発者向けの「再現性ある表示」**が目的です。<code>__repr__</code>だけを定義しておくと、<code>__str__</code>が定義されていないときの代用として使われます。</p>
</div></dd></dl></div>
]]></content:encoded>
					
					<wfw:commentRss>https://python.cbagames.jp/2025/06/23/python-special-methods/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
