【问题标题】:Creating python objects from objects从对象创建 python 对象
【发布时间】:2014-01-14 19:49:56
【问题描述】:

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

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)

这是正确的做法吗?

【问题讨论】:

  • 如果只是字符串列表和索引,为什么不用元组呢?
  • 我要做的比这里展示的要多得多,所以为了简洁起见,我删除了大部分内容。

标签: python oop deep-copy


【解决方案1】:

字符串存储在实例foo,而不是类MyClass,所以你需要for line in foo.a。除此之外,您的解决方案应该可以工作。

另一种解决方案是:

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

或者,简单地使用列表推导,在我看来这是最 Pythonic 的:

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

(关于您的原始解决方案的另一件事是,如果foo.a 很大,它可能效率低下,因为您制作了deepcopy,而您真正需要的是一次复制一行.)

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

【讨论】:

  • 糟糕,是的,这是我在使用 fooMyClass 时的错误。那里有点糊涂。谢谢!
【解决方案2】:

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

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

【讨论】:

  • OP 正在请求OOP 解决方案。
  • 确实,我正在尝试学习如何正确使用OOP,而从OOP perspective 来看,其余代码(我没有显示)确实可以更好地工作。跨度>
猜你喜欢
  • 1970-01-01
  • 2019-06-02
  • 2013-02-11
  • 1970-01-01
  • 2013-11-18
  • 1970-01-01
  • 1970-01-01
  • 2019-05-05
  • 1970-01-01
相关资源
最近更新 更多