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

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

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

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

Q&A

解決済

1回答

538閲覧

別クラスのリストからmainの変数にアクセス

katsu96

総合スコア2

Python

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

0グッド

0クリップ

投稿2020/08/06 17:38

前提・実現したいこと

①Mainでlistを定義する
②MethodでMainのlistに値を格納
③mainでprint

selfの正しい使い方イマイチ理解できていません。
詳しい方教えて下さい。

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

TypeError: append() missing 1 required positional argument: 'self'

該当のソースコード

Python

1import method 2 3class Main(): 4 def __init__(self): 5 self.list_x = [] 6 7def main(): 8 Method.append() 9 print(Main.list_x) 10 11if __name__ == '__main__': 12 Main = Main() 13 Method = method.Method 14 main()

Python

1import main 2 3class Method(): 4 def append(self): 5 self.list_x.append("x1") 6 self.list_x.append("x2")

実行環境

Python 3.8.5

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

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

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

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

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

guest

回答1

0

ベストアンサー

問題点が2つあります。

1. クラスオブジェクトの上書き

このプログラムで最初に実行される

python

1Main = Main()

は、同じ名前なので、MainクラスをMainクラスのインスタンスで上書きしてしまいます。
Main()は二度と使えなくなります。今回はこのように変えます。(Methodも同様に変えています)

python

1mainInstance = Main()
2. MethodクラスのインスタンスからMainクラスのインスタンスへの参照がない

MethodクラスのインスタンスからMainクラスのインスタンス内にあるlist_xを書き換えるためには、MethodクラスのインスタンスからMainクラスのインスタンスへの参照がないといけません。ようはMethodクラスのインスタンスメンバ変数にMainクラスのインスタンスを代入しないといけません。

このためには、Methodクラスにも__init__()を用意します。

python

1class Method(): 2 def __init__(self, mainObject): 3 self.main = mainObject

あとは、この参照を使って、list_xを書き換えればいいだけです。

python

1 def append(self): 2 self.main.list_x.append("x1") 3 self.main.list_x.append("x2")

正解例

python

1import method 2 3class Main(): 4 def __init__(self): 5 self.list_x = [] 6 7def main(): 8 methodInstance.append() 9 print(mainInstance.list_x) 10 11if __name__ == '__main__': 12 mainInstance = Main() 13 methodInstance = method.Method(mainInstance) 14 main()

python

1import main 2 3class Method(): 4 def __init__(self, mainObject): 5 self.main = mainObject 6 7 def append(self): 8 self.main.list_x.append("x1") 9 self.main.list_x.append("x2") 10

投稿2020/08/07 04:18

dameo

総合スコア943

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

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

katsu96

2020/08/08 13:57

ありがとうございます。 selfの理解も深まり、実装することができました。 1点質問ですが、今回用意した「list_x」を数十個用意し、Method.appendで条件に応じて「list_x」に追加するという機能を実装しようとした際、「list_x」を定義する場所はmainじゃない方が理想(綺麗)でしょうか? mainのdef __init__(self)に何行もあるのが綺麗じゃないような気がしているので、一般的に?どういうのが適切なのか知っていたら教えていただきたいです。
dameo

2020/08/08 14:34 編集

「綺麗」「汚い」「一般的」というのは結構主観なので、他人に説明できるものではないですが、個人的な好みで言えば、MainとかMethodとかいうクラス名がもう汚く一般的ではないと思います。 クラスはオブジェクト指向発祥の言葉ですが、オブジェクト指向ではデータに現実に模した何かの意味を与え、その役割に適した名前のメンバ属性やメソッドを持つように仕向けたと思っています。そういう意味では、Mainという曖昧模糊な名前にどんな属性やメソッドがあったとしても、もう正しいのかどうか分からない、というのが私の評価です。Methodについては、明らかにメソッドじゃないオブジェクトなのでNGですね。それらの中身に何が入っていたとしても、何をしてたとしても、なんでもいいのではないかと思ってしまいます。 今回のように、目的が具体的に決まっていないことに対しては、名前と役割の評価が出来ず、それに伴い、その細部である形の評価ができません。役割が決まっていることについては、これがいいと歴史的に決まった適した形があるものもあり、そういうものはデザインパターン、もしくは単にパターンと呼ばれています。そういうモノに当てはまるケースでは、多くの場合、パターンに従っている方が良いとされます。そうでない場合は、「好み」であり、どちらとも言えない場合が多いと個人的に思っています。 ただパターンにないケースでも、具体的に問題が発生している場合は、その個々のケースではそこに問題があるわけですけどね。起きてもない問題について、いろいろ危惧する必要は特にないと思うということです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問