Python: Immer baseclass Werte von abgeleiteten Klasse
Hoffe das ist klar genug:
class myParent():
def __init__( self ):
self.parentNumber = 5
class Child( myParent ):
def __init__( self ):
self.childNumber = 4
def multiplyNumbers( self ):
print myParent.parentNumber * self.childNumber
p = Child()
p.multiplyNumbers()
Möchte ich um die parentNumber einzeln, und dann erreichen, dass die Nummer über die Kind-Klasse, und in diesem Fall verwenden Sie es für einige der Multiplikation.
Ich bin neu in der OOP-Bereich, so dass Allgemeine Hinweise auf die Vererbung ist ebenso willkommen!
Mehr info:
Ich bin der Gestaltung einer Projekt-management-Lösung für vfx-basierte Projekte, und ich Spiele mit Klassen und Vererbung um zu sehen, wie Sie mir helfen können am meisten.
Gerade jetzt, ich habe die top-Klasse, Projekt -, und einer abgeleiteten Klasse, Erschossen. Geschossen hat ein selbst.Länge variabel mit der Länge der spezifischen Aufnahme. Es hat auch eine getLengthInSeconds () - Methode, die verwendet selbst.Länge zusammen mit dem Projekt.fps, um zu bestimmen, die Länge in Sekunden. Das Projekt hat setFps () - Methode, in der die fps eingestellt ist, nachdem eine Instanz der Klasse erstellt wird.
Ich bin eine Art verwendet, um Variablen mit einem Präfix selbst. und haben nicht experimentiert viel mit Klassen mit der "globalen" Variablen, ohne sich selbst zu. . Wenn ich alles global, nicht-selbst., Ich kann das Projekt verwenden.fps ohne Hektik, aber ich bin immer ein "schlechter Programmierstil" Warnung in meinem neckhair. Gibt es vielleicht eine bessere, mehr ordentlich, so?
Edit:
Nach einiger Lektüre, super() scheint ein bisschen gefährlich und ein bisschen mehr als ich brauche, denke ich. Ich bin hauptsächlich mit single-Vererbung-Klassen und sind nicht einmal sicher, wie man die Verwendung von Diamant-Hierarchien.. Ist es ein sicherer Weg, den Zugang zu übergeordneten Variablen und Methoden, die nicht eingeschlossen sind super()?
Edit:
Allright, zu sehen, ob dies Sinn macht oder ob ich denken werde, alles falsch.
Ich bin auf der Suche an den Klassen und der Vererbung von Gruppen und Kinder. Ein Kind weiß, dass es Eltern und allen, die die Werte. Ein Kind zum anderen Elternteil weiß, Dass die Eltern Werte. Was ich versuche zu erreichen ist, dass alle Aufnahmen erstellt werden, die Teil eines Projekts sind. Und jetzt, ich bin die Schaffung Shot() Instanzen von innen-Projekt() der Klasse, indem die Instanzen, um eine Liste der Aufnahmen, die dann gepflegt im Projekt () - Instanz.
d.h.
class myParent( object ):
def __init__( self ):
self.parent_id = ''
self.children = []
def createChild( self, name ):
self.children.append( myChild( name ) )
def getChildren( self ):
return self.children
def setParentId( self, id ):
self.parentId = id
class myChild( myParent ):
def __init__( self, id ):
super(myChild, self).__init__()
self.id = id
def getParentId( self ):
return self.parent_id
p = myParent()
p.setParentId( 'parent01' )
p.createChild( 'child01' )
print p.getChildren()[0].getParentId()
Kann ich sehen, dass die mis-Schritte in der Logik hier, aber keine wirkliche Möglichkeit um ihn herum..
Scheint, wie jedes Kind, ist immer eine neue Instanz des parent-dieser Weg, wo parent_id ist immer eine leere Zeichenfolge.
- Sie benötigen zum Aufruf des superclass-Konstruktors.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie in der Regel verwalten Sie problemlos auch ohne
super
wenn Sie nicht haben, Mehrfachvererbung oder andere Grenze Fälle, obwohl, wenn sich die Basisklasse ändert, werden Sie sich merken müssen, ändern Sie die übergeordnete Klasse name aus init (und jede andere Methode, die bezieht sich auf myParent explizit).Wenn Ihre Eltern
__init__
Parameter, die Sie übergeben müssen Sie von der Kindes__init__
.Wenn Sie mögen die Wiederholung von customParam in allen Kind-Klassen, gibt es eine alternative OO das Muster " zwei Phasen-Konstruktion, welche Werke wie diese:
In diesem Muster, Sie brauche das nicht zu wiederholen übergeordneten Parameter, oder rufen sogar die Eltern
__init__
in das Kind, aber der Nachteil ist, dass Sie brauchen, um zu merken, immer rufen die sekundäre Konstruktor beim erstellen von Objekten, oder Ihr Objekt wird Links teilweise nicht initialisiert.UPDATE (Antwort auf die aktualisierte Frage):
Scheinen Sie zu sein, die Vermischung von zwei nicht verwandten Konzepte von elternschaft hier. Vererbung ist über die Typ-Hierarchie, und Sie scheinen zu werden, nach der ein Eigentümer-Hierarchie (is-a versus has-a).
Ich würde die Struktur der aktualisierte code so:
Müssen Sie nur erkennen
Child
zum ausführen der Initialisierung vonmyParent
. Danach wird die aktuelle Instanz (self
) hat die Instanz-Attribute eine Instanz dermyParent
hätte ( "ist ein" ) verwenden, so können Sieself.parentNumber
. Tun Sie dies, indem Siesuper(Child, self).__init__()
inChild.__init__
(idealerweise auf der ersten Zeile) -myParent.__init__(self)
funktionieren würde, aber es kann falsch sein (auf subtile Weise), wenn sich die Basisklasse ändert oder im Falle der Mehrfachvererbung. Sie können löschen Sie alle die Argumente, diesuper
wenn Sie mit Python 3.Beachten Sie auch, dass
ist sehr Verschieden von
Die ehemaligen wird eine Klasse variable, die von allen Instanzen von
C
. Letztere erstellen Sie eine Instanz-variable, jede Instanz vonC
hat es ' s eigenen. (Ebenso, Globale Variablen sind nicht an Instanzen gebunden ist - aber ich nehme an, Sie sprechen den oben genannten?)self.parentNumber
immultiplyNumbers
.__init__
nimmt Sie als argument auch ist, oder ob es verging eine hartcodierte Standardwert, es muss irgendwoher kommen.