Създаване на 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
OP изисква OOP решение. - person alvas; 27.12.2013
comment
Наистина, опитвам се да се науча как да използвам OOP правилно и останалата част от кода (който не показах) работи по-добре от гледна точка на OOP . - person Firnagzen; 27.12.2013