別クラスのリストからmainの変数にアクセス
解決済
回答 1
投稿
- 評価
- クリップ 0
- VIEW 203
前提・実現したいこと
①Mainでlistを定義する
②MethodでMainのlistに値を格納
③mainでprint
selfの正しい使い方イマイチ理解できていません。
詳しい方教えて下さい。
発生している問題・エラーメッセージ
TypeError: append() missing 1 required positional argument: 'self'
該当のソースコード
import method
class Main():
def __init__(self):
self.list_x = []
def main():
Method.append()
print(Main.list_x)
if __name__ == '__main__':
Main = Main()
Method = method.Method
main()
import main
class Method():
def append(self):
self.list_x.append("x1")
self.list_x.append("x2")
実行環境
Python 3.8.5
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
問題点が2つあります。
1. クラスオブジェクトの上書き
このプログラムで最初に実行される
Main = Main()
は、同じ名前なので、MainクラスをMainクラスのインスタンスで上書きしてしまいます。
Main()は二度と使えなくなります。今回はこのように変えます。(Methodも同様に変えています)
mainInstance = Main()
2. MethodクラスのインスタンスからMainクラスのインスタンスへの参照がない
MethodクラスのインスタンスからMainクラスのインスタンス内にあるlist_xを書き換えるためには、MethodクラスのインスタンスからMainクラスのインスタンスへの参照がないといけません。ようはMethodクラスのインスタンスメンバ変数にMainクラスのインスタンスを代入しないといけません。
このためには、Methodクラスにもinit()を用意します。
class Method():
def __init__(self, mainObject):
self.main = mainObject
あとは、この参照を使って、list_xを書き換えればいいだけです。
def append(self):
self.main.list_x.append("x1")
self.main.list_x.append("x2")
正解例
import method
class Main():
def __init__(self):
self.list_x = []
def main():
methodInstance.append()
print(mainInstance.list_x)
if __name__ == '__main__':
mainInstance = Main()
methodInstance = method.Method(mainInstance)
main()
import main
class Method():
def __init__(self, mainObject):
self.main = mainObject
def append(self):
self.main.list_x.append("x1")
self.main.list_x.append("x2")
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.23%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2020/08/08 22:57
selfの理解も深まり、実装することができました。
1点質問ですが、今回用意した「list_x」を数十個用意し、Method.appendで条件に応じて「list_x」に追加するという機能を実装しようとした際、「list_x」を定義する場所はmainじゃない方が理想(綺麗)でしょうか?
mainのdef __init__(self)に何行もあるのが綺麗じゃないような気がしているので、一般的に?どういうのが適切なのか知っていたら教えていただきたいです。
2020/08/08 23:34 編集
クラスはオブジェクト指向発祥の言葉ですが、オブジェクト指向ではデータに現実に模した何かの意味を与え、その役割に適した名前のメンバ属性やメソッドを持つように仕向けたと思っています。そういう意味では、Mainという曖昧模糊な名前にどんな属性やメソッドがあったとしても、もう正しいのかどうか分からない、というのが私の評価です。Methodについては、明らかにメソッドじゃないオブジェクトなのでNGですね。それらの中身に何が入っていたとしても、何をしてたとしても、なんでもいいのではないかと思ってしまいます。
今回のように、目的が具体的に決まっていないことに対しては、名前と役割の評価が出来ず、それに伴い、その細部である形の評価ができません。役割が決まっていることについては、これがいいと歴史的に決まった適した形があるものもあり、そういうものはデザインパターン、もしくは単にパターンと呼ばれています。そういうモノに当てはまるケースでは、多くの場合、パターンに従っている方が良いとされます。そうでない場合は、「好み」であり、どちらとも言えない場合が多いと個人的に思っています。
ただパターンにないケースでも、具体的に問題が発生している場合は、その個々のケースではそこに問題があるわけですけどね。起きてもない問題について、いろいろ危惧する必要は特にないと思うということです。