Seite 1 von 1

Mehrfachvererbung, auf was man achten muss

Verfasst: Donnerstag 25. November 2004, 14:11
von rayo
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

Re: Mehrfachvererbung, auf was man achten muss

Verfasst: Donnerstag 25. November 2004, 15:12
von joe
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

Verfasst: Donnerstag 25. November 2004, 15:24
von rayo
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

Verfasst: Donnerstag 25. November 2004, 15:41
von mawe
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

Verfasst: Donnerstag 25. November 2004, 15:43
von rayo
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

Verfasst: Donnerstag 25. November 2004, 16:22
von joe
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