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

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

新規登録して質問してみよう
ただいま回答率
85.46%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

724閲覧

python class 初期化について

okahijiki

総合スコア404

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2021/05/24 08:07

編集2021/05/25 03:41

以下、pythonでclassを作り、インスタンス、メソッドにより出力した場合、同じ結果となります。

そのさいにdef_ init を使う/使わない、def init _内を、Pass/Noneにする場合の違いがイマイチ分かりません。

どうぞ、ご教示くださいませ。

python

1class Temp1: 2 def __init__(self): 3 self.x=None 4 self.y=None 5 6 def add(self,x,y): 7 self.x = x 8 self.y = y 9 out = x+y 10 11 return out 12 13a=Temp1() 14a.add(2,3) 15#5 16 17 18class Temp2: 19 def __init__(self): 20 pass 21 22 def add(self,x,y): 23 self.x = x 24 self.y = y 25 out = x+y 26 27 return out 28 29b=Temp2() 30b.add(2,3) 31#5 32 33class Temp3: 34 def add(self,x,y): 35 self.x = x 36 self.y = y 37 out = x+y 38 39 return out 40 41c=Temp3() 42c.add(2,3) 43#5 44

◎こちらを契機に本質問をしています。

def _ _init _ _:
pass
について

python

1#「ゼロから作るDeepLearning」(斎藤康毅)P139より 2 3class AddLayer: 4 def __init__(self): 5 pass 6 7 def forward(self,x,y): 8 out=x+y 9 return out 10 11 def backward(self,dout): 12 dx = dout*1 13 dy = dout*1 14 15 return dx,dy

def _ _init _ _:
self.x = None
self.y = None
について

python

1#「ゼロから作るDeepLearning」(斎藤康毅)P137より 2#https://github.com/oreilly-japan/deep-learning-from-scratch/blob/master/ch05/layer_naive.py 3# coding: utf-8 4 5 6class MulLayer: 7 def __init__(self): 8 self.x = None 9 self.y = None 10 11 def forward(self, x, y): 12 self.x = x 13 self.y = y 14 out = x * y 15 16 return out 17 18 def backward(self, dout): 19 dx = dout * self.y 20 dy = dout * self.x 21 22 return dx, dy 23 24 25class AddLayer: 26 def __init__(self): 27 pass 28 29 def forward(self, x, y): 30 out = x + y 31 32 return out 33 34 def backward(self, dout): 35 dx = dout * 1 36 dy = dout * 1 37 38 return dx, dy 39

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

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

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

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

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

quickquip

2021/05/24 09:11

「違いがイマイチ分からない」状態でなぜこのように書き分けたんでしょうか? という素朴な疑問があります。
okahijiki

2021/05/25 03:44

コメントありがとうございます。 pass/self.x=None,self.y=Noneについては、本質問に加筆しました。 def_ _init __を使う/使わないについては、こちらの思いつきとなります。
guest

回答2

0

ベストアンサー

python

1Temp1().x 2#None 3 4Temp2().x 5#AttributeError: 'Temp2' object has no attribute 'x' 6Temp3().x 7#AttributeError: 'Temp3' object has no attribute 'x'

が大きな違いですかね

投稿2021/05/24 16:53

taC-h

総合スコア289

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

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

okahijiki

2021/05/25 03:48

ご回答ありがとうございます。 アトリビュートがあるか、ないかの違いですね。
guest

0

ここに書かれているコードであれば動作に違いはありません。実行スピードやメモリ消費は若干違いが出る場合もあります。
しかし、どこかの誰かが書いた、よく似た全てのクラス定義やメソッド定義で、その動作に違いが出ないということを保証できるというものでもありません。

投稿2021/05/24 08:22

ppaul

総合スコア24666

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

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

okahijiki

2021/05/25 03:45

ご回答、ありがとうございます。 class内の、def __initi__以外の、defの書き方により動作の違いが出てくる可能性がある、というニュアンスでしょうか。 なお、ご参考までに、本質問に加筆しております。
ppaul

2021/05/25 08:17

一般的には、動作の違いが出てくる可能性があります。 質問に追加されたMulLayerだと、普通はforwardした後でしかbackwardは動かないので違いが分かりませんが、forwardせずにbackwardすると、 TypeError: unsupported operand type(s) for *: 'NoneType' and 'NoneType'というエラーになります。 しかし、MulLayerの__init__をpassだけにしてforwardせずにbackwardすると、 AttributeError: 'MulLayer' object has no attribute 'y' というエラーに変わります。どちらにしてもエラーになるので、書いても書かなくても同じと言えば同じですが、エラーメッセージという動作は異なってきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問