我需要编写一个带有一些原始字符串的类,然后将它们分成一个列表,它作为属性保存。 (除其他外,但这是我现在关注的部分。)像这样:
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)
这是正确的方法吗?
答案 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'))