如何在python

时间:2015-12-22 01:37:25

标签: python python-2.7

我创建了一个类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[:]

我已经使用以下答案修复了我的代码,谢谢

3 个答案:

答案 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