不能在Python类中使用方法列表,它会破坏deepcopy。解决方法?

时间:2011-04-10 21:08:24

标签: python design-patterns deep-copy

我正在尝试通过实现k-Nearest Neighbor分类器来了解有关Python的更多信息。 KNN的工作原理是根据与其最相似的现有数据标记新数据。因此,对于给定的数据表,您尝试确定3个最相似的点(如果k = 3)并选择更频繁的标签。您可以通过不同的方式确定“相似性”,某种距离函数。因此,您可以实现各种距离函数(余弦距离,曼哈顿,欧几里德等)并选择您想要的任何距离。

我正在尝试制作一些东西,让我可以轻松地交换距离函数,而不需要做任何情况,我到目前为止的解决方案是只存储方法的引用列表。这很好,但是它在深度复制中断了,我想弄清楚如何修复我的实现或者在不需要做案例和让深度复制工作之间达成妥协。

这是我的配对课程

class DataTable:

    def __init__(self, filename,TrueSymbol,FalseSymbol):
        self.t = self.parseCSV(filename)
        self.TrueSymbol = TrueSymbol
        self.FalseSymbol = FalseSymbol
        # This is the problem line of code
        self.distList = [self.euclideanDistance,
                            self.manhattanDistance,
                            self.cosineDistance]

    def nearestNeighbors(self,entry,k=None,distanceMetric=None):
        """
        distanceMetrics you can choose from:
        0 = euclideanDistance
        1 = manhattanDistance
        2 = cosineDistance
        """
        if distanceMetric == None:
            distanceFunction = self.euclideanDistance
        else:
            self.distList[distanceMetric]
        # etc..

    def euclideanDistance(self,entry):
        pass
    def manhattanDistance(self,entry):
        pass
    def cosineDistance(self,entry):
        pass

    # open up that csv
    def parseCSV(self,filename):
        pass

这是调用它的代码     import deepcopytestDS     导入副本

data = deepcopytestDS.DataTable("ionosphere.data","g","b")
deepCopy = copy.deepcopy(data) # crash.

这是callstack

>>> deepCopy = copy.deepcopy(data)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/copy.py", line 162, in deepcopy
    y = copier(x, memo)
  File "/usr/lib/python2.6/copy.py", line 292, in _deepcopy_inst
    state = deepcopy(state, memo)
  File "/usr/lib/python2.6/copy.py", line 162, in deepcopy
    y = copier(x, memo)
  File "/usr/lib/python2.6/copy.py", line 255, in _deepcopy_dict
    y[deepcopy(key, memo)] = deepcopy(value, memo)
  File "/usr/lib/python2.6/copy.py", line 162, in deepcopy
    y = copier(x, memo)
  File "/usr/lib/python2.6/copy.py", line 228, in _deepcopy_list
    y.append(deepcopy(a, memo))
  File "/usr/lib/python2.6/copy.py", line 189, in deepcopy
    y = _reconstruct(x, rv, 1, memo)
  File "/usr/lib/python2.6/copy.py", line 323, in _reconstruct
    y = callable(*args)
  File "/usr/lib/python2.6/copy_reg.py", line 93, in __newobj__
    return cls.__new__(cls, *args)
TypeError: instancemethod expected at least 2 arguments, got 0

这次崩溃意味着什么,是否有一些方法可以使深度复制工作无需摆脱交换距离函数的快捷方式?

1 个答案:

答案 0 :(得分:4)

这是一个错误:http://bugs.python.org/issue1515

您可以将它放在文件的顶部以使其正常工作:

import copy
import types

def _deepcopy_method(x, memo):
    return type(x)(x.im_func, copy.deepcopy(x.im_self, memo), x.im_class)
copy._deepcopy_dispatch[types.MethodType] = _deepcopy_method
相关问题