Python对象创建失败

时间:2013-10-12 08:06:51

标签: python class object

我是python的新手,所以这听起来可能是一个愚蠢的问题。 场景: 我有一个集群类,在创建它的实例时,我正在为它提供两个默认值,这些默认值只是质心的坐标,它将是ty

from checkbox.lib.text import split
class point:
   x=0
   y=0
   def toString(self):
      return (self.x+ ':'+self.y)
   def __init__(self,a,b):
      self.x=a
      self.y=b

class cluster:

    points=[]
    centroid= point
    def __init__(self,a,b):
        centroid= point(a,b)
def kMeans(lis,k):
    length=len(lis)
    clusters=[]
    for i in range(k):
        clusters.append(cluster(2*i,2*i))
        print clusters[i].centroid.toString()
    for pt in lis:
        min=10
        centroidNum=0
        for i in range(k):
            dist=(abs(int(pt.x)- int(clusters[i].centroid.x))) +abs((int(pt.y) -    int(clusters[i].centroid.y)))
            if dist<min:
               min=dist
               centroidNum=i
        clusters[centroidNum].points.append(pt)
    for cl in clusters:
        print "Clusters"
        for pt in cl.points:
            print pt.toString()
def readValues():
    try:
        fileHandler = open('/home/sean/input/k_means.txt', 'r')

        for line in fileHandler:
            tokens=split(line,",")
            if len(tokens) == 2:
                tempObj=point(tokens[0].strip(),tokens[1].strip())
                list.append(tempObj)
    except IOError:
           print "File doesn't exist"
if __name__ == '__main__':
    list=[]    
    readValues();
    kMeans(list,3)

我要将值赋给质心,从而传递构造函数。但我得到以下错误:

unbound method toString() must be called with point instance as first argument (got nothing instead)

我希望质心成为一个点,以便我可以在程序的其余部分访问。 请帮我如何为质心指定值

输入文件在表单中有点 1,2 3,5 4,3

2 个答案:

答案 0 :(得分:0)

错误

  

必须使用点实例作为第一个调用未绑定的方法toString()   参数

通常在您直接调用类的实例方法而不是对象的实例时发生。

示例:

class foo(object):

    def bar(self):
        print 'bar'

print foo.bar()


Traceback (most recent call last):
  File "out", line 6, in <module>
    print foo.bar()
TypeError: unbound method bar() must be called with foo instance as first argument (got nothing instead)

所以你必须致电

foo().bar()

答案 1 :(得分:0)

您没有向我们提供问题的完整代码。

首先是一般的Python语法问题:

  • 班级名称应为CamelCase(class Pointclass Cluster
  • 函数名称应为小写(to_string(self):
  • 你猜测的Java(脚本)语法也有一些随机的分号。

看起来像

centroid = Point

正在创建Point的未绑定实例(应为centroid = Point(),但您还需要传递2个参数ab)。

尝试删除此行,以便在Point() __init__函数中创建Cluster实例。

编辑1:

这是你的问题;

__init__ Cluster centroid中,您要设置变量self,但不将其应用于实例(centroid = Point)。因此,它正在尝试使用您在实例中设置的class cluster: points=[] def __init__(self,a,b): self.centroid = point(a,b) ,这是未绑定的。

尝试此设置:

centroid= point

我已经摆脱了centroid的不必要(和错误)初始化,现在我将__init__设置为{{1}}方法中的类的属性。