2015-12-22 74 views
2

我創建了一個類distance_neighbor,其中一個屬性是類Crime的對象列表。
這是我從數據庫查詢結果中獲得的所有屬性的值。
如何在python中爲類的屬性設置列表值

起初,我已經設置data_Crime清單作爲對distance_neighbor類屬性**Crime的價值,我用德爾清除使用後data_Crime列表,從而使data_Crime列表可以在下一循環使用。

這是我的代碼:

conn = psycopg2.connect("dbname='Chicago_crime' user='postgres' host='localhost' password='1234'") 
cur= conn.cursor() 

minDistance=float(input("Nilai minimum distance : ")) 
cur.execute("""SELECT id_objek1, objek1, id_objek2, objek2, distance from tb_distance1 where distance<'%f'""" %(minDistance)) 

class Crime: 
    def __init__(self, id_jenis, jenis): 
     self.id_jenis=id_jenis 
     self.jenis=jenis 

class distance_neighbor (Crime): 
    def __init__(self, distance, **Crime): 
     self.distance = distance 
     self.Crime = Crime 

data_Crime =[] 
data_distance = [] 

for id_objek1, objek1, id_objek2, objek2, distance in cur.fetchall(): 
    data_Crime.append(Crime(id_objek1,objek1)) 
    data_Crime.append(Crime(id_objek2,objek2)) 
    data_distance.append(distance_neighbor(distance, data_Crime)) 
    del data_Crime[:] 

錯誤消息:

data_distance.append(distance_neighbor(distance, data_Crime)) 
TypeError: __init__() takes exactly 2 arguments (3 given) 

我一直在使用下面回答你們修好了我的代碼,謝謝

回答

1

這應該是更接近你想要什麼:

class Crime(object): 
    def __init__(self, id_jenis, jenis): 
     self.id_jenis=id_jenis 
     self.jenis=jenis 

class DistanceNeighbor(object): 
    def __init__(self, distance, crimes): 
     self.distance = distance 
     self.crimes = crimes 


data_distance = [] 
for id_objek1, objek1, id_objek2, objek2, distance in cur.fetchall(): 
    crimes = [Crime(id_objek1,objek1), Crime(id_objek2,objek2)] 
    data_distance.append(DistanceNeighbor(distance, crimes)) 

類在Python 2應始終從object繼承。按照慣例,類名在CamelCase中。

Crime繼承DistanceNeighbor似乎沒有必要。我改變了這一點。

實例屬性應該是小寫,因此我使用crimes而不是類名稱Crime的非常令人困惑的重用。

這條線:

def __init__(self, distance, **Crime): 

需要你Crime實例的列表分開作爲單獨的參數。 在您的情況下,它是指接收__init__

distance, data_Crime[0], data_Crime[0] 

這將導致該錯誤消息:

TypeError: init() takes exactly 2 arguments (3 given) 

Crime實例化是很短。所以,相反的兩個附加您可以在一個行創建兩個Crime實例列表:

crimes = [Crime(id_objek1,objek1), Crime(id_objek2,objek2)] 

因爲這會在每個循環一個新的列表,沒有必要刪除在每個循環中的列表內容,就像你用del data_Crime[:]做的那樣。

0
def __init__(self, distance, **Crime): 

**Crime是關鍵字參數,並期望命名參數。你不需要那個,刪除星號。

此外,重命名的說法,這是非常令人困惑的是它具有相同的名稱作爲類:

class distance_neighbor(Crime): 
    def __init__(self, distance, c): 
     self.distance = distance 
     self.Crime = c 
1

您已在distance_neighbor中將__init__方法定義爲參數(self, distance, **Crime)Crime之前的**告訴Python收集您傳遞到名爲Crime的字典中的所有關鍵字參數。這不是你在做什麼。您的電話是distance_neighbor(distance, data_Crime),其中data_Crime是一個列表。你應該接受作爲__init__方法的正常參數:

class distance_neighbor (Crime): 
    def __init__(self, distance, crime): 
     self.distance = distance 
     self.crime = crime 

這將主要工作,但你仍然有一個問題。問題是創建distance_neighbor對象的循環將爲所有對象重用相同的列表(並使用del data_Crime[:]來清除它們之間的值)。如果您保留對對象中相同列表的引用,則它們將最終在循環結束時引用相同的列表(將爲空)。

相反,你應該爲你的每個循環迭代創建一個新的列表:

for id_objek1, objek1, id_objek2, objek2, distance in cur.fetchall(): 
    data_Crime = [Crime(id_objek1,objek1), Crime(id_objek2,objek2)] 
    data_distance.append(distance_neighbor(distance, data_Crime)) 

這是可行的,但仍有更多的事情,你可能想在你的代碼以提高。首先,distance_neighbor被定義爲從Crime繼承,但這似乎並不合適,因爲它包含Crime的實例,而不是一個本身。它應該可能從object繼承(或者,如果你在Python 3中,那麼object是默認基礎)。您可能還想要更改您的類和變量名稱以匹配Python約定:類別名稱爲CamelCase,函數,變量和屬性爲lower_case_with_underscores

相關問題