如何让类方法返回自己的新实例?

时间:2013-03-21 13:25:48

标签: python

我有一个python类,它有一些列表和变量(在__init__中初始化)。

我希望有一个方法可以对这个特定实例数据进行操作并返回一个新实例(新数据)。最后,此方法应返回具有已修改数据的新实例,同时保留原始实例的数据。

什么是pythonic方法呢?

编辑:

我在类complement()中有一个方法,它以特定的方式修改数据。我想添加一个__invert__()方法,该方法返回带有complement() ed数据的类的实例。

示例:假设我有一个班级A.
A = A()
a.complement()会修改实例a中的数据 b = ~a会使实例中的数据保持不变,但b将包含complement()ed数据。

3 个答案:

答案 0 :(得分:3)

我喜欢实现一个copy方法来创建一个相同的对象实例。然后我可以随意修改新实例的值。

class Vector:
    def __init__(self, x, y):
        self.x, self.y = x, y

    def copy(self):
        """
        create a new instance of Vector,
        with the same data as this instance.
        """
        return Vector(self.x, self.y)

    def normalized(self):
        """
        return a new instance of Vector,
        with the same angle as this instance,
        but with length 1.
        """
        ret = self.copy()
        ret.x /= self.magnitude()
        ret.y /= self.magnitude()
        return ret

    def magnitude(self):
        return math.hypot(self.x, self.y)

所以在你的情况下,你可以定义一个方法:

def complemented(self):
    ret = self.copy()
    ret.__invert__()
    return ret

答案 1 :(得分:2)

copy模块可以像你一样制作一个实例的副本:

def __invert__(self):
    ret = copy.deepcopy(self)
    ret.complemented()
    return ret

答案 2 :(得分:1)

我认为你的意思是在Python example

中实现工厂设计模式