Mehrfachvererbung, auf was man achten muss

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
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Donnerstag 25. November 2004, 14:11

Hi

Ich hab hier ein paar Klassen (vereinfacht):

Code: Alles auswählen

class Displayable(object):
    __slots__ = ['_rect']
    
    def __init__(self):
        super(Displayable,self).__init__()
    
class Surface(Displayable):
    __slots__ = ['_surface']
    
    def __init__(self):
        super(Surface,self).__init__()
    
class Mouse(object):
    __slots__ = ['_state','_key']
    
    NORMAL = 0
    OVER = 1
    PRESSED = 2
    
    def __init__(self):
        super(Mouse,self).__init__()

class Button(Surface,Mouse):
    __slots__ = ['_command','_active','_disabled','_hover','_pressed']
    
    def __init__(self, command, active,disabled=None,hover=None,pressed=None):
Warum gibt diese Zusammenstellung einen:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Projects\Mediaplayer\cd_ripper\display.py", line 358, in __main__
    class Button(Surface,Mouse):
TypeError: multiple bases have instance lay-out conflict
Was mach ich falsch?
Hab noch nie Mehrfachvererbung gebraucht.

Gruss
joe

Donnerstag 25. November 2004, 15:12

Hallo!
rayo hat geschrieben: Hab noch nie Mehrfachvererbung gebraucht.
Bevor man slots braucht (die sind dein problem), braucht man hundertmal eher mehrfachvererbung ;-).
Slots dienen einzig und allein der speicheroptimierung (weil es dann kein __dict__ gibt) und ist nur sinnvoll, wenn du vielleicht hunderttausende oder millionen von instanzen der klasse hast. Wird wohl bei Button nciht der fall sein. Kurz: slots können sich 99,7% der python-programmierer schlicht aus dem gedächnis streichen.
joe
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Donnerstag 25. November 2004, 15:24

hab gedacht das braucht man damits klar ist was klassenvariabeln und membervariabeln sind und bessere kontrolle welche membervariablen existieren und welche nicht

also obs die variable in jeder instanz gleich ist oder pro instanz einen wert hat

Also kann ich die weglassen?

gruss
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Donnerstag 25. November 2004, 15:41

Hi!

Ich hab wiederum gedacht, mit __slots__ legt man fest, welche Attribute angelegt werden können.

Code: Alles auswählen

class A(object):
    __slots__ = ['x']
    def __init__(self):
        self.x = 1

>>>a = A()
>>>print a.x
1
>>>a.x = 3
>>>print a.x
3
>>>a.y = 2
Traceback ...
Gruß, mawe
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Donnerstag 25. November 2004, 15:43

Hi

Ja das dachte ich auch, darum möcht ich nicht einfach diese nicht einfach weglassen, hat schon ein gaar nützliche features, aber nur wegen denen geht das mit der vererbung nicht?

gruss
joe

Donnerstag 25. November 2004, 16:22

Hi!
mawe hat geschrieben:Ich hab wiederum gedacht, mit __slots__ legt man fest, welche Attribute angelegt werden können.
Das ist nur ein "abfallprodukt" von __slots__ und ja auch untypisch für python, das einem ja sonst alle freiheiten lässt. __slots__ ist nur empfehlenswert, wenn die klassen ziemlich klein sind (da nur dann der wegfall von __dict__ merklich speicher spart) und wenn eben seeeeeeehr viele instanzen parallel existieren. Eine klasse, die einen punkt im raum repräsentiert, könnte ich mir da gut vorstellen. Und bei sowas braucht man kaum vererbung, geschweige denn mehrfachvererbung. Letzteres und __slot__ geht eh nicht zusammen. Fragt mich aber nicht nach gründen (von layout hab ich keine ahnung ;-)).
joe
Antworten