Klasse von array.array ableiten.

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
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.
Olliminatore
User
Beiträge: 55
Registriert: Montag 30. Mai 2005, 16:03
Wohnort: schönsten Stadt Deutschlands
Kontaktdaten:

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)
[size=84][url=http://de.wikipedia.org/wiki/Jamba]Love Jamba[/url] <!--Olliminatore-->input<?/> [url=http://www.spreeblick.com/blog/index.php?p=324]Boycott Jamba[/url][code]def olliminiert(optimiert, eliminiert, terminiert):[/code][/size]
henning
User
Beiträge: 274
Registriert: Dienstag 26. Juli 2005, 18:37

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)
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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
Zuletzt geändert von Leonidas am Samstag 10. Dezember 2005, 23:13, insgesamt 1-mal geändert.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
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')
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)
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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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:
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten