Создание объектов Python из объектов

Мне нужно написать класс, который берет несколько необработанных строк, а затем разделяет их на список, который он содержит как атрибуты. (Среди прочего, но это та часть, которая меня сейчас волнует.) Что-то вроде этого:

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)

Это правильный способ сделать это?


person Firnagzen    schedule 27.12.2013    source источник
comment
если это просто список строк и индекс, почему бы вам не использовать кортеж?   -  person alvas    schedule 27.12.2013
comment
Я буду делать намного больше, чем я показал здесь, поэтому я вырезал большую часть для краткости.   -  person Firnagzen    schedule 27.12.2013


Ответы (2)


Строки хранятся в экземпляре 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)(...).

person shx2    schedule 27.12.2013
comment
Упс, да, это была моя ошибка с foo по сравнению с MyClass. Там немного запутался. Спасибо! - person Firnagzen; 27.12.2013

С точки зрения не ООП вы можете просто использовать tuple и получить те же значения bar.

from copy import deepcopy
foo = ('lots of text', 1)
bar = deepcopy(foo[0].split('\n'))
person alvas    schedule 27.12.2013
comment
ОП запрашивает решение OOP. - person alvas; 27.12.2013
comment
Действительно, я пытаюсь научиться правильно использовать OOP, а остальная часть кода (которую я не показывал) лучше работает с точки зрения OOP . - person Firnagzen; 27.12.2013