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

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

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

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

Q&A

解決済

1回答

428閲覧

Python、配列内オブジェクトにつきまして

Behemoth

総合スコア29

Python 3.x

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

0グッド

0クリップ

投稿2018/07/22 10:22

編集2018/07/22 10:28

こんばんは。いつもお世話になっております。
Python3 初心者です。

ary = [['', '', '', '', '', '', ''], ['', '', '', '', '', '', ''], ['', '', '', <classes.sub object at 0x02DDD930>, '', '', ''], ['Thursday', '', '', <classes.sub object at 0x02DDD970>, '', '', ''], ['Friday', '', '', '', '', '', ''], ['Saturday', '', '', '', '', '', '']]

このように、ところどころにクラス(?)を要素としてもつに次元配列があるとします。
また classes.subは特定の数字を返すメソッド「getNumber」をもつとします。

i = 0 while i < len(ary): j = 1 while j < len(ary): if j != "": print(ary.getNumber) ----1 j = j + 1 i = i + 1

ここで二重ループを駆使して、要素がクラスのときのみgetNumberメソッドにより、数字を出力したいのですが、__str__メソッドの方が優先(?)されてしまい、getNumberメソッドが使えません。
具体的には
AttributeError: 'str' object has no attribute 'getNumber'
がでてしまいます。

なにか改善策はありますでしょうか?

よろしくおねがいいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

同じリストにいろんなクラスのインスタンスを放り込むと非常に扱いにくいです。
設計自体を見直した方が良いでしょう。

いちおう、現状のまま解決する方法もご紹介します。

型により分岐する方法

組み込み関数 isinstance で分岐すれば可能です。

Python

1# classes.py 2class sub: 3 def getNumber(self): 4 return 42

Python

1import classes 2 3ary = [ 4 ['', '', '', '', '', '', ''], 5 ['', '', '', '', '', '', ''], 6 ['', '', '', classes.sub(), '', '', ''], 7 ['Friday', '', '', '', '', '', ''], 8 ['Saturday', '', '', '', '', '', ''] 9] 10 11for row in ary: 12 for elem in row: 13 if isinstance(elem, classes.sub): 14 print(elem.getNumber(), end=' ') 15 else: 16 print(elem, end=' ') 17 18 print()

実行結果 Wandbox

plain

1 2 3 42 4Friday 5Saturday

メソッドを適切にオーバーライドする方法

strメソッドの方が優先(?)されてしまい

あるいは、__str__メソッドを自前で定義しても良いでしょう。

Python

1class sub: 2 def getNumber(self): 3 return 42 4 5 def __str__(self): 6 return str( 7 self.getNumber() 8 )

Python

1import classes 2 3ary = [ 4 ['', '', '', '', '', '', ''], 5 ['', '', '', '', '', '', ''], 6 ['', '', '', classes.sub(), '', '', ''], 7 ['Friday', '', '', '', '', '', ''], 8 ['Saturday', '', '', '', '', '', ''] 9] 10 11for row in ary: 12 for elem in row: 13 print(elem, end=' ') 14 15 print()

Wandbox

投稿2018/07/22 10:36

編集2018/07/22 10:40
LouiS0616

総合スコア35660

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

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

Behemoth

2018/07/22 10:40

ご回答ありがとうございました。 大変勉強になります。 設計を変え、また試行錯誤したいと思います。 また、よろしくお願いいたします。
Behemoth

2018/07/22 10:41

補足、わざわざありがとうございます。 勉強させていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問