我创建了一个类distance_neighbor
,其中一个属性是类Crime
的对象列表。
这是我从数据库查询结果中获得的所有属性的值。
首先,我已将data_Crime
列表设置为类**Crime
上的属性distance_neighbor
的值,并且我在使用后使用del清除data_Crime列表,以便{{1 list可以在下一个循环中使用。
这是我的代码:
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[:]
我已经使用以下答案修复了我的代码,谢谢
答案 0 :(得分: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中。
来自DistanceNeighbor
的{{1}}的继承似乎是不必要的。我改变了这个。
实例的属性应该是小写的,因此我使用了Crime
而不是使用类名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)]
中那样删除每个循环中的列表内容。
答案 1 :(得分:1)
您已在__init__
中将distance_neighbor
方法定义为参数(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
表示函数,变量和属性。
答案 2 :(得分:0)
def __init__(self, distance, **Crime):
**Crime
是一个关键字参数,并且需要命名参数。你不需要它,删除星号。
此外,重命名参数,它与该类具有相同的名称是非常令人困惑的:
class distance_neighbor(Crime):
def __init__(self, distance, c):
self.distance = distance
self.Crime = c