我是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
答案 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语法问题:
class Point
和class Cluster
)to_string(self):
)看起来像
行centroid = Point
正在创建Point
的未绑定实例(应为centroid = Point()
,但您还需要传递2个参数a
和b
)。
尝试删除此行,以便在Point()
__init__
函数中创建Cluster
实例。
这是你的问题;
在__init__
Cluster
centroid
中,您要设置变量self
,但不将其应用于实例(centroid = Point
)。因此,它正在尝试使用您在实例中设置的class cluster:
points=[]
def __init__(self,a,b):
self.centroid = point(a,b)
,这是未绑定的。
尝试此设置:
centroid= point
我已经摆脱了centroid
的不必要(和错误)初始化,现在我将__init__
设置为{{1}}方法中的类的属性。