Inhaltsverzeechnes[Verstoppen][Show]
An dësem Virtrag léiere mir iwwer Klassen, Konstruktoren an Ierfschaft am Python.
Dës Konzepter si wierklech wichteg an engem grousse Programm wou verschidden Aarte musse definéiert ginn.
Classes
Klassen si wesentlech am Programméiere a si sinn net spezifesch fir Python. Vill aner programméiere Sproochen d'Notioun vu Klassen ënnerstëtzen. Mir benotze Klassen fir nei Datentypen ze definéieren.
Bis elo hu mir iwwer d'Basisdatentypen am Python geléiert wéi Zuelen, Strings a Booleaner. Dëst sinn déi Basis oder einfach Datentypen am Python. Mir hunn och e puer komplex Datentypen wéi Lëschten an Dictionnairen gesinn.
Och wann dës Zorte extrem nëtzlech sinn, kënnen se net ëmmer benotzt gi fir komplex Konzepter ze modelléieren. Denkt zum Beispill un d'Iddi vun engem Punkt, oder engem Shopping Weenchen. E Shopping Weenchen ass keng Boolean oder eng Lëscht. Et ass eng aner Zort vun Daten. Also kënne mir Klassen benotzen fir nei Aarte ze definéieren fir real Konzepter ze modelléieren.
Elo, loosst eis en neien Datetyp definéieren genannt Punkt. Dësen neien Typ wäert Methoden hunn wéi mir virdru gepréift hunn.
Dëst ass wéi Dir et maacht:
Mir fänken un, eng Klass ze definéieren andeems Dir d'Schlësselwuert "Klass" benotzt an direkt duerno gi mir eiser Klass en Numm.
class Point
Elo, kuckt op d'Nimmkonventioun déi ech hei benotzt hunn. Ech hunn den éischte Buschtaf hei geschriwwen, dat ass wat mir eng Pascal Nummkonventioun nennen. Dës Konventioun ass anescht wéi déi, déi mir benotze fir eis Variabelen a Funktiounen ze nennen, fir déi mir ëmmer kleng Buschtawen benotzen a verschidde Wierder mat engem Ënnersträich trennen. Awer wa mir Klassen nennen, benotze mir keen Ënnersträich fir verschidde Wierder ze trennen amplaz, mir kapitaliséieren den éischte Buschtaf vun all Wuert.
Nodeems mir eis Klass definéiert hunn, gëtt e Colon benotzt wat heescht datt elo e Block definéiert ass.
class Point:
def move (self):
An dësem Block kënne mir all d'Funktiounen oder Methoden definéieren, déi zu Punkte gehéieren. Zum Beispill kënne mir eng Funktioun genannt "Move" definéieren fir e Punkt ze bewegen. Bedenkt datt soubal mir oppe Klammern aginn, PyCharm automatesch hei "Selbst" bäidréit. Dëst ass e spezielle Schlësselwuert a loosst mech kuerz drop zréckkommen. Loosst eis "move" um Terminal drécken.
print("move")
Loosst eis eng aner Method wéi "Zeechnen" definéieren an et um Terminal drécken.
def draw(self):
print("draw")
Mir si fäerdeg mat der Definitioun vun eiser "Punkt" Klass. Mat dësem neien Typ kënne mir nei Objeten erstellen. Eng Klass definéiert einfach de Blueprint oder d'Schabloun fir Objekter ze kreéieren déi déi aktuell Instanzen op deem Blueprint baséieren. Fir en Objet ze kreéieren, tippe mir den Numm vun eiser Klass aus an nennen se dann just wéi eng Funktioun. Dëst erstellt en neien Objet a gëtt et dann zréck. Da kënne mir dësen Objet an enger Variabel späicheren. Loosst mech Iech weisen:
Hei hu mir e "Punkt1" definéiert deen en dreidimensionalen Punkt ass. Dir kënnt dat gesinn, mir kënnen eenzel Koordinaten um Terminal drécken.
Mir kënnen déi zwou Methoden "zeechnen" an "beweegen" mat dësem Punkt benotzen.
Also fir erëmzefannen, benotze mir Klassen fir nei Typen ze definéieren an dës Aarte kënne Methoden hunn déi mir am Kierper vun der Klass definéieren. Klassen kënnen Attributer hunn, déi mir iwwerall an eise Programmer setzen.
Konstruktoren
Bis elo hu mir geléiert wéi nei Aarte mat Klassen erstallt ginn. Elo gëtt et e klenge Problem mat dëser Ëmsetzung. Mir kënnen e Punktobjekt ouni x- oder y-Koordinat mat Klassen erstellen an dat ass net ideal. Loosst mech Iech weisen.
Loosst eis e Punkt erstellen a drécken ier mir d'x Koordinate setzen. Wann Dir eise Programm leeft, gëtt en Attributfehler wéi dësen:
Et heescht datt de Punktobjekt keen Attribut genannt x huet. Elo ass de Problem datt et méiglech ass e Punktobjekt ouni x- oder y-Koordinaten ze hunn. Dëst mécht kee Sënn well wa mir iwwer e Punkt schwätzen, musse mir wëssen wou dee Punkt läit. Fir dëse Problem ze léisen, benotze mir e Konstruktor. E Konstruktor ass eng Funktioun déi geruff gëtt zum Zäitpunkt vun der Schafung vun engem Objet.
Hei ass wéi mir e Konstruktor benotzen. Als éischt, loosst eis d'x an y Koordinatewäerter am uewe genannte Programm passéieren.
point = Point(10, 20)
print(point.x)
Elo musse mir eng speziell Method an dëser Klass addéieren, genannt Konstruktor. Seng Syntax ass esou:
def __init__(self, x, y):
init
ass kuerz fir initialiséiert, an dëst ass d'Funktioun oder d'Method déi genannt gëtt wann en neie Punktobjekt erstallt gëtt. Den x an y ginn direkt duerno derbäi self
fir zwee extra Parameteren ze addéieren.
Duerno sollte mir den x an y op déi passéiert Wäerter dh 10 an 20 mapen
self.x = x
self.y = y
Mir benotzen d' self
fir op den aktuellen Objet ze referenzéieren an da setze mir den x Attribut op den x Argument, deen un d'Funktioun "x" iwwerginn ass. Op dës Manéier benotzt init
Method, kënne mir eis Objekter initialiséieren. Dës Method gëtt als Konstruktor bezeechent. Loosst eis eise Programm lafen.
Elo kënne mir d'x an y Koordinaten spéider änneren. Loosst eis x Koordinate aktualiséieren:
point = Point(10, 20)
point.x = 11
print(point.x)
Elo gëtt d'x Koordinate op Wäert 11 aktualiséiert.
bewéegen
Hei ass eng interessant Übung fir Iech.
Ech wëll datt Dir eng nei Aart definéiert déi eng Persoun genannt gëtt. Dës "Persoun" Objete sollen e "name
" Attribut wéi och e "talk()
”Method.
Et ass eng einfach Aufgab a sollt net méi wéi e puer Minutten daueren.
Léisung
Fänkt un mat der Klass "Persoun" esou ze definéieren:
class Person:
self.name = name
Mir wäerten de Konstruktor spéider definéieren. Elo kënne mir den Objet "Persoun" erstellen. Loosst eis et John nennen
john = Person("John Smith")
print(john.name)
john.talk()
Elo gitt op den éischten Deel vum Code a erstellt e Konstruktor.
def __init__(self, name):
De finalen Code wäert esou ausgesinn:
Dir kënnt och formatéiert Strings an aner Konzepter a Verbindung mat Klassen a Konstruktoren benotzen.
Ierfschaft
Ierfschaft ass en anert Konzept assoziéiert mat Klassen déi Iech e Code erëmbenotzen loossen.
Betruecht dëst Stéck Code.
class Dog:
def walk(self):
print("walk")
Mir hunn eng Klass "Dog" mat enger "Walk" Method erstallt. An dëser Method drécke mir einfach de Walk Message um Terminal. Loosst eis soen, an engem richtege Programm ginn et 10 Zeilen Code amplaz nëmmen eng Zeil hei. An Zukunft, wann eng aner Klass néideg ass fir d'Methode "Walk" ze hunn, musse mir all dee Code widderhuelen. Dëst ass net ideal.
An der Programméierung hu mir e Prinzip genannt DRY, wat kuerz ass fir Iech selwer net ze widderhuelen. Loosst eis iergendwann an Zukunft soen, mir entdecken e Problem mat eiser "Walkmethod" a wa mir dës Method op villen anere Plazen widderholl oder duplizéiert hunn, musse mir zréckkommen an dee Problem op all Plaz fixéieren wou mir dëst duplizéiert hunn Code. Also dofir sollte mir am Programméiere net zweemol eppes definéieren.
Et gi verschidde Approche fir dëse Problem ze léisen awer hei léiere mir deen deen méi einfach ass fir Ufänger an et gëtt Ierfschaft genannt. An dësem Fall wäerte mir eng aner Klass "Mammdéier" schafen an definéieren eis "Walkgang" Attribut an dëser Klass.
class Mammal:
def walk(self):
print("walk")
Nodeems mir eis "Mammal" Klass definéiert hunn, kënne mir Ierfschaft benotzen fir d'Attributer wéi dëst ze passéieren:
Béid Honds- a Kazeklassen ierwen all Klassemethoden, déi an hirer Elterenklass definéiert sinn. Elo kënne mir Methoden spezifesch fir Hënn addéieren wéi dëst:
class Dog:
def bark(self):
print("bark")
Apaken!
Dëst war alles iwwer d'Klassen, Konstruktoren an d'Notzung vum Code a Klassen mat Ierfschaftskonzepter. Elo si mer um Enn vun eiser Serie. Zu dësem Zäitpunkt sollt Dir fäeg sinn gutt, liesbar a präzis Coden am Python ze produzéieren.
Mir wäerten d'Konzept vu Moduler a Packagen an der nächster Virliesung gesinn.
Hannerlooss eng Äntwert