Seite 1 von 1

Klasse von array.array ableiten.

Verfasst: Samstag 10. Dezember 2005, 21:39
von arkanoid
Hallo,
ich scheitere an einer scheinbar einfachen Aufgabenstellung,
und würde es toll finden wenn mich mal jemand erleuchten könnte.

Ich will eine Klasse bauen, die ein Array von type unsigned byte ist.
Sie soll alles können was man von einem Array bzw. einer Liste erwatet.
Ausserdem will ich ihr noch ein paar spezielle Methoden verpassen - aber soweit komme ich leider nicht.

Code: Alles auswählen

import array

class byte_array(array.array): 
    def __init__(self):
        self.__init__('B') 

any=byte_array()  
Hier das Ergebnis:

Code: Alles auswählen

 File "sample.py", line 7, in ?
    any=byte_array()
TypeError: array() takes at least 1 argument (0 given)
Vielen Dank für eure Hilfe.

Edit (Leonidas): Code in Python-Tags gesetzt.

Verfasst: Samstag 10. Dezember 2005, 22:25
von Olliminatore
Ich glaube du hast vergessen ein argument beim Aufruf der classe zu übergeben.

Was ist eigentlich der genau Zweck von Arrays? Sind sie schneller?
Und was wäre dieser Stringe für ein Array-type '123' (habe keinen gefunden)?

(Sorry, dachte passt grade zum Thema)

Verfasst: Samstag 10. Dezember 2005, 22:30
von henning
Ich würde mal wetten, du hast das elterliche __init__ nicht korrekt aufgerufen, das sieht mir irgendwie komisch aus.
Sollte man wohl bessert über Klassen-Namen der Elternklasse (old-style) oder mit super() machen (new-style)

Verfasst: Samstag 10. Dezember 2005, 22:55
von Gast
henning hat geschrieben:Ich würde mal wetten, du hast das elterliche __init__ nicht korrekt aufgerufen, das sieht mir irgendwie komisch aus.
Sollte man wohl bessert über Klassen-Namen der Elternklasse (old-style) oder mit super() machen (new-style)
Du hast recht, ich wollte eigentlich:

Code: Alles auswählen

import array

class byte_array(array.array):
    def __init__(self):
        array.array.__init__(self,'B')
        
any=byte_array()
aber das bringt die gleiche Meldung.
Ich habe schon so viel rumprobiert dass ich wohl durcheinander gekommen bin.
Die function super() kannte ich noch nicht, ergibt aber auch die gleiche Meldung

Code: Alles auswählen

import array

class byte_array(array.array):
    def __init__(self):
        super(byte_array).__init__('B')
Edit (Leonidas): Code in Python-Tags gesetzt.

Verfasst: Samstag 10. Dezember 2005, 23:04
von Leonidas
Hallo arkanoid,

Könntest du das nächste Mal deinen Code in Python-Tags setzen? Danke.

Jetzt zu deinem Problem, folgendes sollte gehen:

Code: Alles auswählen

#!/usr/bin/env python
# -*- encoding: latin-1 -*-

from array import array

class ByteArray(array):
    def __init__(self):
        # wird nicht aufgerufen
        print 'Called __init__'
        # soweit kommen wir nichtmal
        super(ByteArray, self).__init__('B')
    
    def __new__(cls):
        print 'Called __new__'
        super(ByteArray, cls).__init__('B')

any = ByteArray()
Allerdings habe ich es jetzt nicht weitergetestet, es lief, das hat mir dann gereicht. 8) HTH.

Edit: self gegen cls eingetauscht. Konventionssachen halt.

Verfasst: Samstag 10. Dezember 2005, 23:11
von BlackJack
`array.array` implementiert die `__new__()` Methode, also muss man die auch benutzen, wenn man eine Unterklasse erstellt.

Code: Alles auswählen

class byte_array(array.array):
    def __new__(cls):
        return array.array.__new__(cls, 'B')

Verfasst: Samstag 10. Dezember 2005, 23:19
von Gast
Leonidas hat geschrieben:Hallo arkanoid,
Könntest du das nächste Mal deinen Code in Python-Tags setzen? Danke.
Klar - sieht gleich viel besser aus.
Leonidas hat geschrieben: Jetzt zu deinem Problem, folgendes sollte gehen:

Code: Alles auswählen

#!/usr/bin/env python
# -*- encoding: latin-1 -*-

from array import array

class ByteArray(array):
    def __init__(self):
        # wird nicht aufgerufen
        print 'Called __init__'
        # soweit kommen wir nichtmal
        super(ByteArray, self).__init__('B')
    
    def __new__(self):
        print 'Called __new__'
        super(ByteArray, self).__init__('B')

any = ByteArray()
Allerdings habe ich es jetzt nicht weitergetestet, es lief, das hat mir dann gereicht. 8) HTH.
Super - vielen Dank - Ihr seid echt fix ( und dass um 23:00)

Verfasst: Samstag 10. Dezember 2005, 23:21
von Gast
BlackJack hat geschrieben:`array.array` implementiert die `__new__()` Methode, also muss man die auch benutzen, wenn man eine Unterklasse erstellt.
Vielen Dank jetzt verstehe ich auch den Hintergrund.
Habe ich bis jetzt in keinem Buch gefunden.

Verfasst: Samstag 10. Dezember 2005, 23:25
von Leonidas
Anonymous hat geschrieben:Vielen Dank jetzt verstehe ich auch den Hintergrund.
Habe ich bis jetzt in keinem Buch gefunden.
Wenn du genauer nachschlagen willst, die Suchwörter für deine Lieblingssuchmaschine lauten "Python" und "metaclasses". :idea: