Тёмный

Python Tutorial #23 - Instanz- und Klassenvariablen 

The Morpheus Tutorials
Подписаться 253 тыс.
Просмотров 55 тыс.
50% 1

In diesem Video zeige ich, was Instanz und Klassenvariablen sind und wie ihr mit ihnen umgehen könnt.
Playlist: • Python Tutorials Deutsch
Meine Website mit allen anderen Kanälen und Newsletter *:
the-morpheus.de/
Discord:
the-morpheus.d...
Unterstützt mich - Danke!:
www.patreon.co...
www.paypal.me/...

Опубликовано:

 

21 окт 2024

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 82   
@ma888u
@ma888u 8 лет назад
Perfekt!!! Ist sicher Geschmacksache aber für mich eine der besten Tutorials überhaupt!!! Besonders hat man das Gefühl es hier nicht von einem abgehobenen Profi erklärt zu bekommen sondern von jemanden der es selber erstmal lernen musste! Vielleicht macht es das so angenehm!!! Thumps up!
@TheMorpheusTutorials
@TheMorpheusTutorials 8 лет назад
vielen Dank =)
@baris1513
@baris1513 3 года назад
top video , großes Lob ! Ich habe jetzt durch deine Videos schon so vieles lernen dürfen, von dem ich mir vor einiger Zeit gar nicht hätte denken können es je gelernt haben zu werden. Danke
@Gereon_
@Gereon_ 7 лет назад
In einem anderen Tutorial hatte mal jemand gesagt, dass Klassen eine Art *Bauplan* für, nunja, Objekte sind. Fand das immer ganz gut um sich das vorstellen zu können. Vielleicht hilft das anderen hier auch weiter ... :)
@hanshans4006
@hanshans4006 5 лет назад
Hätte auch eher objekt als instanz gesagt
@TheNightingaleDarts
@TheNightingaleDarts 2 года назад
ich fand den begriff schablone eigentlich immer ganz gut.
@easypy
@easypy 2 года назад
Super Veranschaulichung von Instanzen!
@seppneimusser5723
@seppneimusser5723 5 лет назад
Du bist der Beste, ich habe alles "auf Anhieb" verstanden, danke dir Morpheus...^^
@TheMorpheusTutorials
@TheMorpheusTutorials 5 лет назад
❤️
@eyriusbacterius
@eyriusbacterius 6 лет назад
Okay.. ich glaub ich muss mir die letzten 2-3 vids nochmal angucken xD
@TheMorpheusTutorials
@TheMorpheusTutorials 6 лет назад
und ausprobieren nicht vergessen ;)
@Flo1379
@Flo1379 4 года назад
feel you
@transzendenz1774
@transzendenz1774 6 лет назад
Also mit __init__ kann man praktisch variablen in einer Klasse machen, die von dem Objekt abhängig sind, und nicht für alle Objekte gleich? Ps: Du bist der coolste.
@TheMorpheusTutorials
@TheMorpheusTutorials 6 лет назад
genau :)
@thorinspruceshield9279
@thorinspruceshield9279 2 года назад
Für mich bis jetzt eines der schwierigsten themen. Hab es immer noch nicht ganz gerallt aber wird bestimmt
@rickor5036
@rickor5036 Год назад
Wenn ich die Erklärung bzgl. "static reference vs primitive" in Klassen richtig verstanden habe, böte sich vlt der Vergleich zu Defaults in Funktionen an - die Referenz oder der Wert wird bei Erzeugung einmalig kopiert, was den scheinbar unterschiedlichen Effekt erklärt, da man beim Primitiv den Wert ändert, während die Referenz im Beispiel nicht die Referenz ändert, sondern die referenzierte Instanz. (Ich schätze, würde man eine neue Liste zuweisen, würden sich die 2 Instanzen auch da unterschiedlich verhalten?) Ist (vlt) etwas zu kompliziert an der Stelle, mir ging es v.a. darum, dass man den Vergleich zum Effekt bei Defaults hervorheben könnte, von wegen "ist vlt bisschen blöd zu kapieren" 😉
@mizech
@mizech 6 лет назад
Wenn man den Klassenbezeichner verwendet (statt der Instanzreferenz), dann kann man die primitiven, statischen Properties ändern. Und das gilt dann global. instanz1 = MyClass() instanz2 = MyClass() MyClass.zahl = 58 print(instanz1.zahl) # 58 print(instanz2.zahl) # 58
@TheMorpheusTutorials
@TheMorpheusTutorials 6 лет назад
Danke fürs Ergänzen!
@zockertrash7591
@zockertrash7591 4 года назад
Bin ich zu blöde oder fehlen hier informationen. class Test: zahl1 = 0 def hallo(self, zahl2): self.zahl1 = zahl2 Test2 = Test() Test3 = Test() Test.zahl = 1 print(Test2.zahl1) print(Test3.zahl1) Wenn ich das ausführe kommt bei mir hier in der Konsole: 0 0 zurück. Wenn ich sie richtig verstanden habe möchten sie das bei mir hier: 1 1 zurück kommt. Stehe ich auf dem Schlauch, mache was falsch, oder habe ich sie falsch verstanden? Mit Grüssen
@mcoken1997
@mcoken1997 4 года назад
@@zockertrash7591 wenn du statt: Test.zahl =1 --> Test.zahl1 = 1 schreibst, dann müsste es funktionieren, da die Klassenvariable ja "zahl1" heißt und nicht "zahl". Damit müsste es durchaus funktionieren. Mit dem Test.zahl = 1 erzeugst du zusätzlich eine neue Klassenvariable "zahl", auf die man mit jeder Instanz, also z.B. mit Test2 und Test3 in diesem Fall, auch zugreifen kann, beispielsweise so: Test2.zahl. Klingt bisschen kompliziert, aber ich hoffe es ist verständlich. :)
@cia1537
@cia1537 4 года назад
zocker Trash Du fürst die Funktion "hallo" gar nicht aus. Nenne sie einfach in __init__ um!
@adazuse2483
@adazuse2483 3 года назад
Beim mir ist es so, der befehl instanz.do_something(1337) ändert nur den wert von instanz.zahl, instanz2.zahl ist weiterhin 42 ... wenn ich wie du sagst MyClass.zahl = 1337 schreibe, dann funktioniert, das nur bei den instanzen wo ich noch nicht den .do_something befehl aufgerufen habe... irgendwie scheinen die variablen durch .do_something von eine klassen-variablen zu einer instanz-variablen zu werden
@ru3sttechnology785
@ru3sttechnology785 6 лет назад
+The Morpheus Tutorials Ich habe mir das Video jetzt 2 mal angeschaut und habe es schließlich doch verstanden. Puhh war das jz MindFuck ,aber hey ich habe es verstanden. Und ich hätte zwei Fragen und zwar Konstruktoren werden doch verwendet ,um die Variablen einer Klasse zu Initialisieren? Außerdem ist doch die Line def do_something(self, neuezahl): eine Funktion der Klasse oder?
@TheMorpheusTutorials
@TheMorpheusTutorials 6 лет назад
Glückwunsch =) genau richtig :)
@noel3298
@noel3298 2 года назад
Hast du nicht vergessen auch für instanz2 eine do_something auszuführen??
@maloxkurambada1129
@maloxkurambada1129 4 года назад
Heißt das atomare Variablen sind primitive Variablen?
@xXFidinator
@xXFidinator 7 лет назад
Erstmal großes Danke für die Videos. Ich habe eine Frage zu dem Problem mit mutable/immutable: Und zwar habe ich das Programm aus dem Video nachgeschrieben, aber den Teil "self.list.append(neuezahl)" durch "self.list = [neuezahl]" ersetzt. Dann wurde es komischerweise nur für die erste instanz ausgeführt und die instanz2 behielt ihre ursprüngliche Liste. Wie kann das sein? Wäre froh, wenn mir da einer weiterhelfen könnte.
@TheMorpheusTutorials
@TheMorpheusTutorials 7 лет назад
Das liegt daran, dass du mit self.list auf einer Referenz arbeitest. Im Fall von append nimmst du Referenz und fügst dieser ein Element hinzu. Das bedeutet aber, dass es nur ein Objekt gibt und instanz und instanz2 sich eine Referenz auf DASSELBE Objekt halten. Mit self.list = [neuezahl] setzt du bei einem der beiden Objekte eine Referenz auf eine komplett neu erstellte Liste für self.list ein. Dadurch verschwindet für dieses Objekt die alte Liste, das 2. Objekt hat aber immer noch seine alte Referenz und behält die alte Liste :)
@maxgrun3458
@maxgrun3458 7 лет назад
Dann hast du das im Video aber falsch erklaert, wenn du den Vergleich zu den static Variablen Java ziehst. Die sind ja voellig unabhaengig von den instanzen und es gibt damit auch nur eine Referenz. Hier gibt es fuer jede Instanz eine Referenz.
@TheMorpheusTutorials
@TheMorpheusTutorials 7 лет назад
das stimmt :(
@christianwagner987
@christianwagner987 3 года назад
3:17 Wir haben ja soweit mit "do_something" die Klassenvariable "zahl" von MyClass geändert. Die ist, sowie ich es verstanden habe statisch (zumindest würde man es so in Java sagen). Was genau passiert denn mit der Klassenvariable "zahl" wenn ich sie mit der Funktion verändere, dass habe ich irgendwie noch nicht so ganz verstanden, da sie dann die Eigenschaft einer Instanzvariable übernimmt und eben für die jeweiligen Instanzen zwei unterschiedliche Werte ausgibt, was ja eigentlich gegen eine Klassenvariable spricht.
@rupertbauernfeind
@rupertbauernfeind 4 года назад
Sind immutable Variablen wirklich immer atomar? Das wäre nämlich sehr interessant für Micro-Controller-Programmierung mit Python
@naheliegend5222
@naheliegend5222 6 лет назад
Pass passiert eigentlich, wenn man zwei __ init __ in einer class definiert?
@TheMorpheusTutorials
@TheMorpheusTutorials 6 лет назад
Leider nicht, man darf nur eine festlegen. Allerdings kannst du ja default parameter angeben
@tobotis2658
@tobotis2658 4 года назад
Kann man mehrere Konstruktoren gleichzeitig in einer Klasse haben? Weil wenn man dann etwas in die Klammer bei z.B. MyClass(...) schreibt, weiß man ja nicht zu welchem Konstruktor die jeweiligen Werte gehören🤔
@TheMorpheusTutorials
@TheMorpheusTutorials 4 года назад
Nope, in python geht das nicht, aber in sehr vielen anderen Sprachen schon. Dort wird dann geguckt, welchen Typ die Parameter in welcher Reihenfolge haben und dementsprechend der Konstruktor ausgewählt
@dontbetoxic4387
@dontbetoxic4387 3 года назад
gibts zwar nicht aber falls du es brauchst lern c# :)
@spicypictures1177
@spicypictures1177 6 лет назад
Müsste man nicht, um die statischen Variablen überschreiben zu können, die @setter-Methode anwenden? Oder codest du nicht in Python 3?
@TheMorpheusTutorials
@TheMorpheusTutorials 6 лет назад
Doch und ja :D
@spicypictures1177
@spicypictures1177 6 лет назад
Aber das machst du nicht weil?
@smoban
@smoban 2 года назад
@@spicypictures1177 ..es in dem tutorial nicht darum geht
@guidogaggl4020
@guidogaggl4020 5 лет назад
hey hab da nen code gefunden bei dem ne counter-variable als klassenvariable definiert wird und dann jedes mal um eins erhöht wenn eine neue instanz erzuegt wird. warum wird hier dieser integer sehr wohl wire ne klassen variable behandelt und nicht wie in deinem video als ne klassenvariable?? (aka jedes mal auf null und dann auf eins gesetzt?) also ich habs ausprobiert und er zählt echt stetig aufwärts??? class MyClass: globalClassCount = 0 def __init__(self, initialData): self.data = initialData MyClass.globalClassCount += 1 def getData(self): return self.data def getClassCount(self): return MyClass.globalClassCount
@guidogaggl4020
@guidogaggl4020 5 лет назад
ok ich habs glaub ich in meinem bsp wird die Klassenvariable myclass.globalClassCount um eins erhöht statt wie bei die die Instanzvariable mit self. ...... also wegen dem "Klassenname. ..... " statt dem "self. ....."
@TheMorpheusTutorials
@TheMorpheusTutorials 5 лет назад
Jup, exakt 👍
@simonhuber2018
@simonhuber2018 7 лет назад
Wenn primitive Variablen für jede instanz eine andere Reverenz haben, gibt es ja keinen grund die in def __init__(self): zu schreiben oder?
@TheMorpheusTutorials
@TheMorpheusTutorials 7 лет назад
doch, grade dafür ist es enorm wichtig. in der init kannst du die self.whatever-Variablen definieren. Das sind die, die sich pro Instanz unterscheiden
@simonhuber2018
@simonhuber2018 7 лет назад
The Morpheus Tutorials bei 3:10 sagst du aber dass zahlen sich auch als klassen veriabeln so wie instanzvariabeln verhalten. Hast es auch an nem Beispiel gezeigt. Also mit primiziven Variabeln habe ich Zahlen gemeint. Hab es oben bischen schwammig beschrieben. Also gibt es einen Unterschied ob ich eine Zahlen Variable als Klassen variable oder instanz var. definiere? denn offensichtlich verhalten sie sich in diesem Beispiel gleich
@TheMorpheusTutorials
@TheMorpheusTutorials 7 лет назад
ach das meinst du, sorry. Schau dir dazu am Besten das etwas spätere Video an, da hab ichs nochmal ein bisschen klarer gemacht, da Python da ein wenig seltsam ist
@danielpietschmann5294
@danielpietschmann5294 5 лет назад
@@TheMorpheusTutorials auf welches Video verweist du hier?
@bauerfischer3030
@bauerfischer3030 3 года назад
@@danielpietschmann5294 hast du es gefunden?
@justmatrix-streams1370
@justmatrix-streams1370 3 года назад
dieses halihalo ist so nice zu höhren warum sagst du es heute nicht mehr so oft
@TheMorpheusTutorials
@TheMorpheusTutorials 3 года назад
Soll ich wieder? 😂
@justmatrix-streams1370
@justmatrix-streams1370 3 года назад
@@TheMorpheusTutorials ja haha also ich finde es sympathisch
@dietervololol2329
@dietervololol2329 6 лет назад
hallo ich habe ein problem: ich möchte ein skript schreiben mit dem ein user sich in einen vorhandenen account einloggen kann, oder einen neuen erstellen kann. wie könnte ein skript dafür ausschauen, ich hätte an eine klasse User gedacht. bleibt das ganze gespeichert? ich bräuchte dringend deine hilfe. hier ein teil meiner idee: class User: def __init__(self, name, level, rank): self.name = name self.level = level self.rank = rank while True: premier = input("Willst du dich einloggen ('e') oder ein neues Konto registrieren ('r')? ") if premier == 'e': old_uzer = input('Ok, dann gib bitte deinen Benutzernamen ein (oder \'back\'): ') # wie kann ich aufrufen ob ein user in der klasse registriert ist if premier == 'r': new_uzer = input('Ok, dann gib bitte deinen zukünftigen Benutzernamen ein (oder \'back\'): ') wuzer = User(new_uzer, 0, 'Standard') #usw.
@TheMorpheusTutorials
@TheMorpheusTutorials 6 лет назад
Hi, du wirst entweder eine Datenbank oder aber eine Textdatei brauchen in der du die Dinge speichern kannst
@dietervololol2329
@dietervololol2329 6 лет назад
The Morpheus Tutorials wie mache ich das genau?
@TheMorpheusTutorials
@TheMorpheusTutorials 6 лет назад
ist in der Playlist erklärt
@dietervololol2329
@dietervololol2329 6 лет назад
Ja is ok ich probiers mal irgendwie. Ich melde mich falls ich nochmals hilfe brauche. Aber danke, Dieter
@Mondkraft
@Mondkraft 7 лет назад
Also bei print(instanz2.list) kommt bei mir eine leere Liste heraus, aber bei print(instanz.list) kommt bei mir der angegebenen Wert (bei instanz.do_something(7130) heraus. Irgendwie verstehe ich da die Logik noch nicht. Weil die Variable Instanz und Instanz2 sich ja nur um einen Buchstabe unterscheiden. instanz = MyClass('b') instanz2 = MyClass('c') instanz.do_something(7130) print(instanz2.list)
@Mondkraft
@Mondkraft 7 лет назад
Ich glaub ich hab jetzt verastanden, wieso das so ist. instanz ruft do_something auf, aber istanz2 tut das nicht.
@TheMorpheusTutorials
@TheMorpheusTutorials 7 лет назад
genau :)
@luposX
@luposX 7 лет назад
okay soweit bin ich auch gekommen aber warum tut instanz2 dosomething nicht aufrufen?
@istrue256
@istrue256 7 лет назад
Also dadurch, dass du die Liste in den Konstruktor gesetzt hast, wurde die Liste beim Ausführen vorher jedes Mal geleert. Und weil nur 'instanz' die Liste erweitert (und instanz2 nicht), enthält dann auch nur bei instanz die Liste einen Inhalt und bei Instanz2 nicht (weil sie ja da vorher wieder geleert wurde und sie selbst nicht erweitert)(?) Und das Problem ist aber nur bei Listen, weil strings und Zahlen in Variablen - sofern sie als Klassenvariablen definiert sind - bei jedem neuen "Ausführen" (aufrufen) wieder ihren Standardwert erhalten(?) Dann macht es ja sogesehen auch nur für Listen Sinn sie in den Konstruktor zu schreiben... (als gegebene Variable)
@TheMorpheusTutorials
@TheMorpheusTutorials 7 лет назад
Stells dir lieber so vor: Instanzvariablen sind für jede Instanz der Klasse nochmal separat vorhanden, d.h. jede Instanz hat ihre eigenen davon. Klassenvariablen werden geteilt, d.h. alle Instanzen haben dieselben Werte drin liegen und wenn eine Instanz da was ändert, merken das alle anderen auch
@istrue256
@istrue256 7 лет назад
Okay das versteh ich. Aber eigentlich spielt das ja am Ende nur noch für Listen eine Rolle, weil normale Variablen ja immutable sind und sich deswegen dann wie Instanzvariablen verhalten, auch wenn sie nicht im Konstruktor stehen. Oder?
@TheMorpheusTutorials
@TheMorpheusTutorials 7 лет назад
Ne absolut nicht. Kleines Beispiel: Wir haben Hund a und Hund b. Wenn abc eine Instanzvariable ist (am Anfang = 0) und ich mache a.abc = 42 und gebe a.abc und b.abc aus, dann kommt erst 42 und dann 0 raus. Wenn es eine klassenvariable ist, kommt beides mal 42 raus.
@istrue256
@istrue256 7 лет назад
class Hund: abc = 0 string = "zeichenkette" def __init__(self): pass def do_something(self, neuezahl): self.abc = neuezahl a = Hund() b = Hund() a.do_something(42) print(a.abc) print(b.abc) Da kommt doch auch erst 42 und dann 0 raus....? Und ich dachte daran, dass die abc "immutable" wäre...
@istrue256
@istrue256 7 лет назад
hey, sonst antwortest du doch auch immer :( Ich würde das mit den Instnanz- und Klassenvariablen gerne zu Ende verstehen.. (eigentlich dachte ich das hätte ich schon, aber anscheinend doch nicht^^)
@user-gm4mm8yl9p
@user-gm4mm8yl9p 5 лет назад
Hallo, ich weiß ich bin spät dran. Habe aber trotzdem eine Frage: wann genau benutzt man __init__ und wann würde auch eine normale defintion wie def do_something ausreichen? Deine Videos haben mir schon sehr geholfen!
@TheMorpheusTutorials
@TheMorpheusTutorials 5 лет назад
Dazu schau dir am besten das Video in der Python Playlist zu Konstruktoren an =) ___init___ ist der Konstruktor
@schokoriegell
@schokoriegell 5 лет назад
1:05 du kannst auch STRG+D
@TheMorpheusTutorials
@TheMorpheusTutorials 5 лет назад
Jup, gute Idee
@schokoriegell
@schokoriegell 5 лет назад
@@TheMorpheusTutorials ich habe mir schon andere Tutorials angeschaut und deine waren bis jetzt die besten👍
@DeathNecrid
@DeathNecrid 6 лет назад
Was ich noch nicht ganz verstehe, ist was es mit diesem self. auf sich hat
@TheMorpheusTutorials
@TheMorpheusTutorials 6 лет назад
self bezieht sich immer auf die Variablen der aktuellen Instanz. D.h. wenn du 2 Tische hast und self in der Klasse benutzt hast, bezieht es sich immer auf den Tisch, der zB get_beine() aufruft. Wenn also Tisch a 5 Beine hat, Tisch b nur 1, kriegst du bei a.get_beine() 5 raus und bei b.get_beine() 1. Und das beim selben Code :)
@proxtxproxtx9876
@proxtxproxtx9876 5 лет назад
Kurz gesagt fügst du deinem Objekt eine Variable hinzu nur in einer Function
@derdeutsche2082
@derdeutsche2082 Год назад
nicht sehr gut erklärt
Далее
Python exercise - Tic Tac Toe
35:02
Просмотров 77 тыс.
Python #27 - Exceptions
12:21
Просмотров 29 тыс.
aespa 에스파 'Whiplash' MV
03:11
Просмотров 14 млн
Python Tutorial #21 - Klassen
11:24
Просмотров 110 тыс.
Python #24 - Vererbung
8:42
Просмотров 53 тыс.
Python Classes and Objects - OOP for Beginners
8:01
Просмотров 559 тыс.
aespa 에스파 'Whiplash' MV
03:11
Просмотров 14 млн