从对象创建python对象

时间:2013-12-27 07:52:50

标签: python oop deep-copy

我需要编写一个带有一些原始字符串的类,然后将它们分成一个列表,它作为属性保存。 (除其他外,但这是我现在关注的部分。)像这样:

class MyClass(object):
    def __init__(self, raw, index):
        self.a = raw.split("\n")
        self.index = index

因此,MyClass的一个实例将具有一个属性.a,这是一个包含原始字符串中的行的列表,我初始化该对象,以及一个属性.index,它是我给它的索引,对吗?但是,我还希望能够生成MyClass的其他实例,每个实例只包含一行原始文本,但拥有相同的索引。

我目前正在考虑的是:

from copy import deepcopy
foo = MyClass("lots of text", 1)
bar = []
for line in foo.a:
    copy = deepcopy(MyClass)
    copy.a = line
    bar.append(copy)

这是正确的方法吗?

2 个答案:

答案 0 :(得分:4)

字符串存储在实例foo上,而不是类MyClass,因此您需要for line in foo.a。除此之外,您的解决方案应该有效。

另一种解决方案是:

for line in foo.a:
    bar.append(MyClass(line, foo.index))

或者,简单地使用列表理解,这在我看来最恐怖:

bar = [ MyClass(line, foo.index) for line in foo.a ]

(关于原始解决方案的另一个问题是,如果foo.a很大,它可能会效率低下,因为当你真正需要的只是复制一个时,它会生成deepcopy一次一行。)

编辑:要完成此答案,请考虑您要子类MyClass,并将子类的实例分配给foo。在这种情况下,使用deepcopy将保留类型,而显式实例化MyClass则不会。一种解决方法是将MyClass(...)替换为type(foo)(...)

答案 1 :(得分:0)

从非OOP的角度来看,您可以简单地使用tuple,并获得相同的bar值。

from copy import deepcopy
foo = ('lots of text', 1)
bar = deepcopy(foo[0].split('\n'))