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

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

新規登録して質問してみよう
ただいま回答率
85.35%
オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

5502閲覧

__mul__(__add__など特殊メソッド)ってどんな時に使うんですか?

Yuki.I

総合スコア1

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

2グッド

3クリップ

投稿2020/05/04 14:47

前提・実現したいこと

先月からpythonを独学で学んでいます。
学習時間は40時間程度のド素人です。

発生している問題・エラーメッセージ

mul(__add__など計算する特殊メソッド)の①必要性や②どんな時に使うのかをご教示いただきたいです。
__mul__の概念なのか使い方なのかが理解できていません。

恐らく自分の中で「__mul__は計算するためのメソッドである」と解釈してしまっていることが間違っているんだと思います。
具体的には、下記図【2】のやり方で計算できるのに、【1】の必要性って何?の答えが分かりません。

分かりづらいご質問になっていましたら申し訳ございません。宜しくお願い致します。

【1】================
class answer:
def init(self,num):
self.num=num

def __mul__(self,other): self.other=other return self.num*other.num

x=answer(8)
y=answer(9)

print(x*y)
==================

【2】==================
class answer:
def init(self,num,other):
self.num=num
self.other=other

def size(self): return self.num*self.other

answer1=answer(8,9)
print(answer1.size())
==================

python3.8.2です

UranHikaru, DrqYuto👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hayataka2049

2020/05/04 15:14

質問を編集してコードを ```python ここにコード ``` のように囲うように書いてください。markdownを使わないとうまく表示されません。
guest

回答3

0

ベストアンサー

__mul__*の動作を実装するためにあります。他の言語でいうところの演算子オーバーロードに近いです。
(ただし、オーバーロードというよりは「そもそもPythonの演算子はすべて特殊メソッド呼び出しに変換される」といった方が実情にそぐうでしょう。1 * 2ですら内部的に(1).__mul__(2)と実行されます(もしかしたら処理系の実装が最適化するようになっているかもしれませんが、原則はそう))

自分で定義したクラスに対して演算子を使えるようにしたいときに使えます。もちろんそれなりの知識がないと使いこなせないですし(データモデルをちゃんと把握する必要があります)、一般ユーザが触れることはほとんどありません。学習時間40時間で知っておく必要はまずありません。

本格的に活用するのは、たとえばライブラリ開発者の人たちです。numpyなどでは多用されています。たとえば、

python

1>>> import numpy as np 2>>> a = np.arange(4).reshape(2, 2) 3>>> a 4array([[0, 1], 5 [2, 3]]) 6>>> a + 1 7array([[1, 2], 8 [3, 4]]) 9

numpy.ndarray__add__を実装しているから実現しています。

投稿2020/05/04 15:24

hayataka2049

総合スコア30935

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Yuki.I

2020/05/04 15:59

ありがとうございます。__mul__が何なのかは分かりました。 どんな時に使うかについては、クラスに自分で定義した演算子を実装する?時に、__mul__等は使うってことですか? まだ、開発とかしたことないのでわからないのですが、開発段階で使うことになるってことですか?
hayataka2049

2020/05/04 16:06

自分で定義した演算子を実装する時ではなく、演算子の種類はpythonの言語仕様で定義されていて、種類に応じた動作を対応する特殊メソッドで実装する形です。 回答に書いた内容と被りますが、一般的なpython開発者が書くことはほぼないでしょう。演算子が使えるクラスを定義したいというケースはそれほど多くありません。一年くらい存在を忘れていても何も不都合はない可能性が高いです。
Yuki.I

2020/05/04 16:12

ありがとうございます。理解できました。ご丁寧にご説明いただきありがとうございます!
guest

0

文字列は 加算演算子で文字列を連結します。乗算演算子で繰り返します。
'Fizz'+'Buzz' 、"なんでやねん!"*3

pathlib では、パスの連結に 除算演算子 を使ってます。
https://docs.python.org/ja/3/library/pathlib.html

漢字の数字を数値に変換するクラスを作って、漢字のまま演算できるようにしてみました。
https://qiita.com/shiracamus/items/d4be0bdfbe62d644d985

川渡り問題「宣教師と人喰い」で船と岸の人数増減計算に __add____sub__を使ってみました。
https://qiita.com/shiracamus/items/ce536aaad95932dbbfb5

ビット和演算子をコマンドのパイプ処理に見立ててみました。
https://qiita.com/shiracamus/items/5ef30ab2b44d38c62e94

投稿2020/05/04 21:13

編集2020/05/05 06:04
shiracamus

総合スコア5406

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Yuki.I

2020/05/05 05:12

ありがとうございます。どんな時に使われるのかイメージすることができました。 すごい難しそうですが、私もこれぐらいのことが実装可能になれるように頑張ります。 ありがとうございます!
guest

0

投稿2020/05/04 14:52

y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Yuki.I

2020/05/04 15:09

ありがとうございます。特殊メソッドは下記の考え方があるってことですか?その場合、考え方以外で、異なることはないのでしょうか? ①クラス内のメソッドを見るだけで何がしたいのかすぐに意味を理解することができ、可読性が向上する②コードのエラーリスクを減らすことができる
y_waiwai

2020/05/04 15:19

__mul__ というメソッドを実装していると、そのクラス変数どおしの * による演算ができるようになります answer1=answer(8,9) よりも x*y のほうが簡単に理解できますね まあ、こんな簡単な例じゃなく、 (x*y+z)/w とかの式を実装しようと思ったら、特殊メソッド無しでどう実装すればいいかすぐに思いつくでしょうか
Yuki.I

2020/05/04 15:27

下記が思いつきました。 class answer: def __init__(self,w,x,y,z): self.w=w self.x=x self.y=y self.z=z def size(self): return (self.x*self.y+self.z)/self.w answer1=answer(2,2,2,2) print(answer1.size())
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問