tuple paveldėjimas

C
  • 8 Kov '10

Sveiki,

kaip reikia paveldėti ir builtino tuple, kad išlaikyti visas tuple savybes?

Pvz. noriu turėti

class MyClass(tuple):
    def __init__(self, name=None):
        self.name = name
        self.somedata = InitializeSomeImmutableDefaultData()
if __name__ == "__main__":
    t = MyClass("name")

Tokios klasės man reikia, nes yra tam tikri duomenys, kuriuos aš žinau iš anksto ir noriu inicializuoti kaip tuple, bet nenoriu kaip atskiros savybės daryti, kad kreiptis per tašką: for i in t.mydata, tiesiog noriu for i in t

C
  • 8 Kov '10

Nors gal tuple ne pats tinkamiausias man variantas, geriau gal list'ą...

S
  • 8 Kov '10

Nesvarbu, list ar tuple, daroma taip pat:

class MyTuple(tuple):
    def test(self):
        print('ok')

t = MyTuple((1, 2))
t.test()
C
  • 8 Kov '10

Na taip, bet jeigu aš noriu iškart užpildyti kažkokiais duomenimis, kaip tada daryti?

Ta prasme, kad a = MyList(name="somename"), a jau būtų užpildytas duomenimis... Pvz:

class MyList(list):
   def __init__(self, name="default"):
      self.data = ["a", "b", "c"]
      self.name = name

if __name__ == "__main__":
   a = MyList("name")
   try:
      a.index("a")
   except:
      pass

Ir listas nebus su "a", "b" ir "c" reikšmėm. Tai va ir klausimas, kaip padaryti, kad jis jau būtų užpildytas, kai tik sukūriu klasę?

S
  • 8 Kov '10

Tokiu atveju, reikia daryti taip:

class MyList(list):
    def __init__(self, name='default'):
        list.__init__(self, ['a', 'b', 'c'])
        self.name = name

if __name__ == '__main__':
    a = MyList('name')
    assert 'a' in a
    assert 'name' == a.name
C
  • 9 Kov '10

Arba dar galima ir taip:

class MyList(list):
    def __init__(self, name='default'):
        super(MyList, self)
        self.append("a")
        self.append("b")
        self.append("c")
        self.name = name

if __name__ == '__main__':
    a = MyList('name')
    assert 'a' in a
    assert 'name' == a.name

Bet vistiek ačiū

S
  • 9 Kov '10

Arba dar galima ir taip:

class MyList(list):
    def __init__(self, name='default'):
        list.__init__(self)
        self.extend(['a', 'b', 'c'])
        self.name = name

if __name__ == '__main__':
    a = MyList('name')
    assert 'a' in a
    assert 'name' == a.name