1

次の方法を見てください。

def load_ad_mediums_from_file(self, filename ):
    file = io.open( filename, "r" )
    ad_mediums = {}
    for line in file:
        if len(line) > 0 and line[0] != 'a':
            parts = line.strip().split(";")
            ad_medium = Objects.Ad_Medium()
            ad_medium.id = int( parts[0] )
            for i in range(1,8):
                cat_parts = parts[i].strip().split(",")
                category_id = int(cat_parts[0]);
                ad_medium.categories[category_id] = float(cat_parts[1])
                ad_medium.impressions[category_id] = int(cat_parts[2]) 

            ad_mediums.update( { ad_medium.id : ad_medium } )
    file.close()
    return ad_mediums

問題:ファイルの各行が異なるため、ad_mediumsディクショナリの値はすべて同じ値になります。私には、新しいオブジェクト "ad_medium = Objects.Ad_Medium()"を作成しても効果はなく、前のループのオブジェクトの値を上書きするだけのように見えます。

どうすればこれを修正できますか?

編集:Ad_Mediumクラス

class Ad_Medium(object):

id = 0
categories = { 1:0.0, 2:0.0, 3:0.0, 4:0.0, 5:0.0, 6:0.0, 7:0.0 }
impressions = { 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0  } 

def __str__(self):
    string = str(self.id) + ";"
    for i in range(1,8):
        string += str(i) + "," + str( self.categories[i] ) + "," + str( self.impressions[i] ) + ";"
    return string[:-1] + "\n"



def normalize_categories_with_impressions(self ):
    impressions = 0.0
    for i in range(1,8):
        impressions += float(self.impressions[i])

    if impressions == 0.0: 
        return

    for i in range(1,8):
        self.categories[i] = float(self.categories[i])/float(impressions)



def reset_categories(self):
    for i in range(1,8):
        self.categories[i] = 0
4

1 に答える 1

5

クラス定義では、id、カテゴリ、およびインプレッションはクラス属性です (すべてのインスタンスで共有されます)。ステートメントは「ad_medium.id = int( parts[0] )id」インスタンス属性を定義しますが、カテゴリとインプレッション (リバウンドではなく変更されたもの) に対するすべての操作は、クラス属性で機能します。クラス定義に、インスタンス属性を作成する初期化メソッドを含める必要があります。つまり、次のようになります。

class Ad_Medium(object):
    def __init__(self):
        self.id = 0
        self.categories = { 1:0.0, 2:0.0, 3:0.0, 4:0.0, 5:0.0, 6:0.0, 7:0.0 }
        self.impressions = { 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0  } 

Python のオブジェクト モデル、属性ルックアップ ルールなどについて詳しく学ぶことを強くお勧めします。

于 2012-07-04T15:15:04.067 に答える