2016-09-08 5 views
-1

Ich habe eine Klasse:Klasse Vererbung von Eigenschaften, wenn Eigenschaft ist eine andere Klasse Eigenschaft in Python

class a(): 
    def __init__(self): 
     self.x = ["a", "b"] 

und eine andere Klasse:

class b(): 
    def __init__(self, r): 
     self.y = r 
    def chg(self, a): 
     self.y = a 

ich tun:

>>> m = a() 
>>> m.x 
["a", "b"] 
>>> n = b(m.x) 
>>> n.y 
["a", "b"] 
>>> n.y = ["c", "d"] 
>>> n.y 
["c", "d"] 
>>> m.x 
["a", "b"] 

Nun, warum nicht m.x wechseln zu ["c", "d"]? Wie kann ich das erreichen?

+1

ganze Zahlen sind unveränderlich. Das können Sie nur, wenn Sie die ganze Zahl in ein unveränderliches Objekt oder eine unveränderliche Klasse umbrechen. –

+1

@ Jean-FrançoisFabre Herr, eigentlich die Art der Eigenschaften sind Listen, keine ganzen Zahlen. Ich habe Integer in diesem Beispiel verwendet, um es einfach aussehen zu lassen. Soll ich Listen in meiner Frage verwenden? – alwbtc

+1

@alwbtc zu sehen, wie sie zwei verschiedene Dinge sind, ja, ja du solltest. – MooingRawr

Antwort

2

Vererbung funktioniert in Python nicht so. Ich denke jedoch, Ihr Problem ist Mutabilität und nicht Vererbung selbst. (Sie haben die Vererbung nicht angewendet, ich habe diese angegeben, weil Sie sie als Tag und im Titel verwendet haben.)

Versuchen Sie es so.

class a(): 
    def __init__(self): 
     self.x = [5] 

class b(): 
    def __init__(self, r): 
     self.y = r 
    def chg(self, a): 
     self.y = a 

m = a() 
n = b(m.x) 
n.y[0] = 99 
print m.x 
# Gives 99 

Auf diese Weise erstellen Sie nur eine Liste und verwenden sie mit zwei verschiedenen Klassen.

Hinweis: Sie können dies denken als Pass von Referenz Eigenschaft in C-Typ Sprachen.

Nur um zu bedenken, jede Zuordnung in Python ist übergeben durch Verweis, weil Python Variablen anders als diese Sprachen behandelt. Read more about it. (Dies hat keine Auswirkungen auf die Wandlungsfähigkeit.)

Bearbeiten: Ich sehe, dass Sie Ihre Frage bearbeitet. Lassen Sie mich nun erklären, warum Ihr Code nicht wie erwartet funktioniert.

Mutabilität bedeutet, dass Sie die Elemente in einem Container ändern können, ohne sie einer neuen Adresse im Speicher zuzuordnen.

Wenn Sie das tun,

n.y = ["c", "d"] 

Sie ändern sich nicht auf der Liste, (so dass Sie nicht mutieren die Liste) Sie gerade eine neue Liste zu diesem Variablennamen zuweisen. Um die ursprüngliche Liste zu ändern, müssen Sie jedes Element ändern, indem Sie list[index] verwenden, damit das Element geändert wird, aber die Liste wird dieselbe Liste sein. So können Sie diese tun

m = a() 
n = b(m.x) 

new_list = ["c", "d"] 

for i, elem in enumerate(new_list): 
    # This way you change every element one-by-one. 
    n.y[i] = elem 

print m.x 

Wenn Sie nicht vertraut sind mit enumerate, studieren Sie es sofort. Aber wenn Sie möchten, einfachen Code verwenden (und ähnlichen C-Implementierung.) Sie können die Zuordnungen wie diese machen,

for i in range(len(new_list)): 
    n.y[i] = new_list[i] 
+3

Ich stimme zu: nicht im Zusammenhang mit der Vererbung überhaupt! –

+0

Ich habe meine Frage geändert, jetzt ist Eigenschaft eine Liste von Zeichenfolgen, aber es wird sowieso nicht funktionieren. – alwbtc

+0

@alwbtc Bitte überprüfen Sie die Antwort noch einmal. – Rockybilly

1

Oke, so dass Sie brauchen ein wenig Lesen zu tun auf, wie das Gedächtnis funktioniert in Python. Was Sie tun hier:

>>> n = b(m.x) 
>>> n.y 
5 

für den Wert m.x Fordert de sie an den Konstruktor von n zu senden. Der Wert von m.x ist 5 in diesem Moment, also wird 5 an den Konstruktor übergeben, der dann die NUMMER 5 im Objekt und nicht die Speicheradresse in der Variablen m.x speichert. Bedeutet, dass n in keiner Weise mit m verknüpft ist. Wenn Sie also m.x aktualisieren möchten, bleibt n gleich, weil die Daten für m an einem anderen Ort als n gespeichert sind.

In einer Sprache wie C könnten Sie die Adresse der Variablen an den Konstruktor übergeben, aber das ist in Python nicht möglich. Die einzigen Variablen in Python, die Adressen verwenden, sind Arrays. Wenn Sie diese Funktionalität wirklich benötigen, sollten Sie sich die Verwendung von Einzelelement-Arrays näher ansehen.

Ein weiterer Tipp, den ich Ihnen geben würde ist geben Sie Ihre Klassen und Variablen Eigennamen nicht nur einzelne Zeichen Namen!

Verwandte Themen