オブジェクトはリスト内包にメソッドを含みません

Nov 27 2020

この質問は、私の前の質問とそこでのビルの回答に関連しています。

subfile.pyにStrucDataという名前のクラスがあります

class StrucData:  
    def __init__(self, name):
        self.name=name
    
    def loadData(self, size=1, cost=1):
        self.size=size  
        self.cost=cost
        return self

メインファイルで私は:

  1. サブファイルを呼び出し、
  2. データ名のリストを作成する
  3. リストをループしてオブジェクトをインスタンス化します。そして
  4. 各オブジェクトに対して「loadData」メソッドを使用してデータをロードします(この例を簡単にするために、同じ「サイズ」と「コスト」を使用しています)。

リスト内包表記を使用して一度に:

# in the main file

from subfile import StrucData 

listIndex=['data1','data2','data3']
listObjects = [StrucData(idx).loadData(size=3, cost=4) for idx in listIndex]

出力は

listObjects=[object1, object2, object3]

各オブジェクトには、subfile.pyで定義された属性(名前、サイズ、コスト)が含まれています。

私が疑問に思うのは、同じコードを使用して1つのオブジェクトを定義するときです。

x=StrucData(listIndex[0]).loadData(size=3, cost=4) 

メソッド「loadData」も含まれています。

なぜそれが起こるのか誰かが私に説明してもらえますか?

Spyderのanaconda3ディストリビューションを使用していますが、バージョン情報は

回答

2 PatrickArtner Nov 27 2020 at 12:23

Spyder内でアプリケーションをデバッグするときに使用されるインスペクターは、リスト内のオブジェクトを同じタイプの単一のオブジェクトとは異なる方法で処理します。単に異なるものを表示し、リストにある場合は機能を省略します。

印刷することで、両方のオブジェクトにこのメソッドがあるかどうかを簡単に確認できます。

listIndex = ['data1','data2','data3']
listObjects = [StrucData(idx).loadData(size=3, cost=4) for idx in listIndex]

other = StrucData("other").loadData(size=3, cost=4) 

print(listObjects[0].loadData)
print(other.loadData)

リスト要素の1つを正規変数に割り当て、そのインスペクター出力をチェックして次のことを確認できます。

lO = listObjects[1]

ブレークポイントを設定して検査します。これでメソッドが表示されます。

理由について:Spyderのデバッグインスペクターコードを担当するコーダーに尋ねてください。危険な推測として:リスト内にバンドルされているオブジェクトを表示するときに画面の資産を節約するため。