Misaku
@Misaku (Misaku suzuki)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

オブジェクト指向 継承の練習をしています、

Python にて オブジェクトを 書く練習をしています。
クラスを .pyファイルへ記述して、main.ipynbファイルへインポートして実行する形にしているのですが、
Event というクラスを作り、Event_nomikai と Event_live というクラスへ継承させて main.ipynbファイルで実行しようとしているのですが、引数が足りないというエラーが出てきてしまい、困っています。

error
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Input In [1], in <module>
      1 from event import Event, Event_nomikai, Event_live
----> 3 nomikai_M = Event_nomikai()
      4 nomikai_M.do_event()

TypeError: __init__() missing 1 required positional argument: 'band'

該当

event.py

class Event:
    def __init__(self, band, event_name, event_naiyou):
        self.band = band
        self.event_name = event_name
        self.event_naiyou = event_naiyou

        

class Event_nomikai(Event):
    def __init__(self, band, event_name="飲み会",event_naiyou="酒やつまみを摂取"):
        super().__init__(band)
        super().__init__(event_name)
        super().__init__(event_naiyou)
        
        
    def do_event(self):
       
        print(f"{self.band.band_name}{self.event_name}{self.event_naiyou}しました。")  
     
        print("メンバーは全員酔っ払いました")
            
      

    
class Event_live(Event):
    def __init__(self, band, event_name="Live",event_naiyou="演奏"):
        super().__init__(band)
        super().__init__(event_name)
        super().__init__(evebt_naiyou)
        
        
    def do_event(self):
       
        print(f"{self.band.band_name}{self.event_name}{self.event_naiyou}しました。")  
            
        
        print("メンバーは全員演奏しました。")
main.ipynb
from event import Event, Event_nomikai, Event_live

nomikai_M = Event_nomikai()
nomikai_M.do_event()

自分で試したこと

変数band に引数がないと言われるので、bandへ引数を記述したり、いっそbandの記述を全て削除したりしたのですが、

band = "MIKETEA"を記述時のエラー
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Input In [1], in <module>
      1 from event import Event, Event_nomikai, Event_live
----> 3 nomikai_M = Event_nomikai()
      4 nomikai_M.do_event()

File ~/environment/Band/event.py:12, in Event_nomikai.__init__(self, band, event_name, event_naiyou)
     11 def __init__(self, band="MIKETEA", event_name="飲み会",event_naiyou="酒やつまみを摂取"):
---> 12     super().__init__(band)
     13     super().__init__(event_name)
     14     super().__init__(event_naiyou)

TypeError: __init__() missing 2 required positional arguments: 'event_name' and 'event_naiyou'
band を削除時のエラー
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Input In [1], in <module>
      1 from event import Event, Event_nomikai, Event_live
----> 3 nomikai_M = Event_nomikai()
      4 nomikai_M.do_event()

File ~/environment/Band/event.py:13, in Event_nomikai.__init__(self, event_name, event_naiyou)
     11 def __init__(self, event_name="飲み会",event_naiyou="酒やつまみを摂取"):
---> 13     super().__init__(event_name)
     14     super().__init__(event_naiyou)

TypeError: __init__() missing 1 required positional argument: 'event_naiyou'

と同じようなエラーが出てしまいます。
event_naiyou は、オブジェクトを定義した時点で event_naiyou = "飲み会"としてあるにもかかわらずエラーとなってしまいます。
どなたかお力をお貸しください、よろしくお願いします。

0

2Answer

 確かにおっしゃっている通り小クラスEvent_nomikaiでのデフォルト引数でevent_naiyouを設定していますが,本質はそこではありません.
 なぜなら,親クラスEventでは3つの引数band, event_name, event_naiyouを必要としているにもかかわらず,super().__init__(band)のように1つしか渡していないからです.

エラーは

TypeError: __init__() missing 2 required positional arguments: 'event_name' and 'event_naiyou'

でしたね,翻訳すると

TypeError: __init__() に必要な位置引数が 2 つありません。event_name' と 'event_naiyou' です。

です.したがって,3つとも親クラスEventに渡してあげましょう.

class Event_nomikai(Event):
    def __init__(self, band, event_name="飲み会",event_naiyou="酒やつまみを摂取"):
        super().__init__(band, event_name, event_naiyou)

どうして1つずつ渡してしまうことになったのか,疑問が残るところですが,とりあえずEvent_liveも同様です.

 また,band = "MIKETEA"を記述時のエラーを示していただいていますが,bandは他で定義されたオブジェクトを期待しているのではないですか?文字列を入れてしまっては後に続くself.band.band_nameでエラーが出ます.

 かといって,bandに対してデフォルト引数を設定しない状態では,main.ipynbにおいて引数を渡さずにnomikai_M = Event_nomikai()としてしまっているのもあり,ここでもエラーが出ます.

 あとツッコミどころとして,前回@shiracamus さんに言われていた通り,PEP8に従ったクラス名になっていないことですかね.また,Eventクラスの中なのに変数にいちいちeventと入っているのも気になります.

改善案を出しておきます.

event.py
class Band:
	def __init__(self, name):
		self.name = name

class Event:
	def __init__(self, band, name, contents):
		self.band = band
		self.name = name
		self.contents = contents

class Nomikai(Event):
	def __init__(self, band, name = "飲み会", contents = "酒やつまみを摂取"):
		super().__init__(band, name, contents)
	
	def invoke(self):
		print(f"{self.band.name}{self.name}{self.contents}しました.")
		print("メンバーは全員酔っ払いました")
	
class Live(Event):
	def __init__(self, band, name = "Live", contents = "演奏"):
		super().__init__(band, name, contents)
	
	def invoke(self):
		print(f"{self.band.name}{self.name}{self.contents}しました.")
		print("メンバーは全員演奏しました")
main.py
from event import Band, Nomikai, Live

band = Band("MIKETEA")
nomikai = Nomikai(band)
nomikai.invoke()

 どうしても上のコードにおけるデフォルト引数でbandを設定したい場合は文字列を入れてしまうのではなく,ちゃんとオブジェクトを宣言してあげて

class Nomikai(Event):
	def __init__(self, band = Band("MIKETEA"), name = "飲み会", contents = "酒やつまみを摂取"):
		super().__init__(band, name, contents)

のようにしてあげる必要がありますね.
いっそ次のようにしてしまうのもアリです(ナシです).

event.py
表示 = print

class バンド:
	def __init__(自己, 名前):
		自己.名前 = 名前

class イベント:
	def __init__(自己, バンド, 名前, 内容):
		自己.バンド = バンド
		自己.名前 = 名前
		自己.内容 = 内容

class 飲み会(イベント):
	def __init__(自己, バンド, 名前 = "飲み会", 内容 = "酒やつまみを摂取"):
		super().__init__(バンド, 名前, 内容)
	
	def 開催(自己):
		表示(f"{自己.バンド.名前}{自己.名前}{自己.内容}しました.")
		表示("メンバーは全員酔っ払いました")

class ライブ(イベント):
	def __init__(自己, バンド, 名前 = "Live", 内容 = "演奏"):
		super().__init__(バンド, 名前, 内容)
	
	def 開催(自己):
		表示(f"{自己.バンド.名前}{自己.名前}{自己.内容}しました.")
		表示("メンバーは全員演奏しました.")
main.py
from event import バンド, 飲み会, ライブ

_バンド = バンド("MIKETEA")
_飲み会 = 飲み会(_バンド)
_飲み会.開催()

ちゃんと動きます.こう見るとイベントクラスでの変数にいちいちevent_と入っているのが馬鹿馬鹿しく思えてくるはずです.

3Like

Comments

  1. @Misaku

    Questioner

    ありがとうございます。
    __init__ の後の記述方法について理解が足りていなかったのでとても勉強になりました。

    PEP8に従ったクラス名について、前回の質問に答えていただいた時にはすっかり見逃していました。このような規定?があることを初めて知りました!
    少しじっくり読んで勉強します。

消えてしまったようなので投稿しておきます、

# のタグの件、ありがとうございました。。
気をつけます、、

またよろしくお願いします。

0Like

Your answer might help someone💌