-2

我是 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 形式的点

4

2 回答 2

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()
于 2013-10-12T08:16:48.947 回答
0

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

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

  • 类名应该是 CamelCase ( class Pointand class 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__方法中类的属性。

于 2013-10-12T08:21:01.800 回答