OO-Programmierung für ganz blöde .....

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
JROppenheimer
User
Beiträge: 13
Registriert: Mittwoch 7. Dezember 2005, 09:17
Wohnort: FFM

Kann mir vlt mal einer den Unterschied zwischen Klassenattributen und Objektattributen erklären? Dafür wäre ich sehr dankbar!
YOU NO MESS WITH LO WANG!
(unintent'lly left blank)

Klassenattribute sind Eigenschaften einer Klasse,
Objektattribute sind Eigenschaften einzelner Objekte.

Beispiel:

Klasse "Auto"

Klassenattribute der Klasse "Auto":
Anzahl Räder=4
Anzahl Lenkräder=1,
Anzahl Motoren=1,
Anzahl Rückwärtsgänge=1

Objekt "Lothar's Manta 1.9" von der Klasse "Auto"

Objektattribute des Objekts "Lothar's Manta 1.9":
Baujahr = 1979
Farbe = Beige,
Spitzengeschwindigkeit = 290,
Anzahl Fuchsschwänze = 1,
Anzahl überholte GTIs = 73,

Wie man das syntaktisch in Python-Code übersetzt, kannst Du
jedem Programmierhandbuch zu Python entnehmen.
JROppenheimer
User
Beiträge: 13
Registriert: Mittwoch 7. Dezember 2005, 09:17
Wohnort: FFM

also die erklärung war gut, danke, aber irgendwie stehe ich immernoch auf dem schlauch. also:

1. haben denn nicht alle Objekte von der Klasse Auto das Attribut z.B. Fuchsschwanz oder Farbe.?

2. Ich versuche mein Problem mal an meinem Bsp. klar zu machen:
ich soll zwei Klassen erstellen, Student und Tutor. Student wird abgeleitet von object und soll über die Klassenattribute Name und Matrikelnummer verfügen und noch über das Objektattribut Betreuer. (die Klasse Tutor mal aussen vorgelassen.)

Wenn ich das jetzt versuche analog zu AUTO zu machen, dann wäre ein Klassenattribut z.B. BEINE = 2 aber doch nciht Name und Matrikelnummer, die wären dann so wie ich das verstanden habe Objektattribute, genau wie Betreuer.

gruß J.R.
YOU NO MESS WITH LO WANG!
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Code: Alles auswählen

>>> class SpamAndEggs(object):
...     cls_attrib = None
...     def __init__(self):
...             obj_attrib = None
...
>>> s = SpamAndEggs()
>>> s.obj_attrib = "obj_attrib gesetzt"
>>> s.obj_attrib
'obj_attrib gesetzt'
>>> SpamAndEggs.cls_attrib = "cls_attrib gesetzt"
>>> s.cls_attrib
'cls_attrib gesetzt'
>>> t = SpamAndEggs()
>>> t.cls_attrib
'cls_attrib gesetzt'
>>> SpamAndEggs.cls_attrib = "neu gesetzt"
>>> s.cls_attrib
'neu gesetzt'
>>> t.cls_attrib
'neu gesetzt'
Ich hoffe das hilft dir etwas.
TUFKAB – the user formerly known as blackbird
(unintent'lly left blank)

Bist du sicher, daß class Student die *Klassenattribute* Name und
Matr.Nr. haben soll ? Daß würde heißen, daß alle Studenten denselben
Namen und Mat.Nr. haben !?

Beispiel für class attribute:

class auto:
raeder=4

Beispiel für Instanzattribut:

mein_manta = auto()
mein_manta.ueberholte_GTIs=73

Anwendung:
print auto.raeder --> "4"
print mein_manta.raeder --> "4"
print mein_manta.ueberholte_GTIs --> "73"
Gast

ja genau das ist ja mein problem, bei deiner erklärung oben. wenn alles objektattribute sein sollen, würd ichs verstehen. aber so wie du das erklärt hast, wären name matno und betreuer objekt- bzw. instanzattribute. weil jeder student einen anderen hat!

beine haben sie alle (hoffentlich) 2
henning
User
Beiträge: 274
Registriert: Dienstag 26. Juli 2005, 18:37

Anonymous hat geschrieben:ja genau das ist ja mein problem, bei deiner erklärung oben. wenn alles objektattribute sein sollen, würd ichs verstehen. aber so wie du das erklärt hast, wären name matno und betreuer objekt- bzw. instanzattribute. weil jeder student einen anderen hat!

beine haben sie alle (hoffentlich) 2
Vielleicht kläre ich nochmal ein paar Begriffe:
Klasse - Eine Klasse kann man sich als Vorlage für konkrete Objecte vorstellen, sie ist im Grunde der allgemeine Fall. (z.B. Auto, Elefant)

Objekt - Ein Objekt ist eine Instanz einer Klasse, Objekte haben zunächst die attribute ihrer Klasse, diese lassen sich aber überschreiben.

Höchstwahrscheinlich willst du, dass Matrikelnummer, Name, etc... Objektattribute sind, da sie wie gesagt, normalerweise bei jeder Instanz einen anderen Wert haben.

Studenten haben alle 2 Beine also

Code: Alles auswählen

class Student:
  beine = 2
Ein spezielle Student hat eine spezielle Matrikelnummer und einen speziellen Betreuer:

Code: Alles auswählen

hans = Student()
hans.matrnr = 123
hans.name = "Hans Mustermann"

jochen = Student()
jochen.matrnr = 456
jochen.name = "Jochen Beispielmeier"
jochen.betreuer = hans
In diesem Beispiel hätten alle Studenten 2 Beine und hans wäre der Betreuer von jochen.
Die einzelnen Instanzen (also hans und jochen) besitzen die Information "beine = 2" nicht, aber wenn ich versuche, auf sie zuzugreifen, wird die Anfrage zu ihrer Klasse Student "durchgeschleust":

Code: Alles auswählen

print Student.beine # Ergibt: 2
print jochen.beine # Ergibt: 2
print hans.beine # Ergibt: 2
Nehmen wir an, hans wurde ein Bein amputiert:

Code: Alles auswählen

hans.beine = 1
Nun besitzt die Instanz hans die Information "beine = 1", wenn hans also nach beinen gefragt wird, schleust er nicht mehr zu seiner Klasse durch:

Code: Alles auswählen

print hans.beine # Ergibt: 1
print jochen.beine # Ergibt: 2
print Student.beine # Ergibt: 2
JROppenheimer
User
Beiträge: 13
Registriert: Mittwoch 7. Dezember 2005, 09:17
Wohnort: FFM

vielen dank, die Hilfestellung hat alle meine Annahmen bestätigt oder korrigiert :D

vlt kann sich noch jemand erbarmen und mir den Unterschied zwischen:

ein Klassenobjekt

und

Objekt einer Klasse

erklären.

danke, gruß Timmy
YOU NO MESS WITH LO WANG!
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

"Von Klassen, Studenten und Beinen".... Sehr Amüsant :)

Wäre was für das Wiki!

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
henning
User
Beiträge: 274
Registriert: Dienstag 26. Juli 2005, 18:37

JROppenheimer hat geschrieben: ein Klassenobjekt
Der Begriff sagt mir so alleinstehend nichts, eine Klasseninstanz würde ich noch verstehen, das wäre das selbe wie ein Objekt.
Vielleicht ist die Klasse selbst gemeint (Klassen sind ihrerseits auch wieder Objekte)
Objekt einer Klasse
Damit könnte wohl sowas wie "beine" gemeint sein, beine wäre dann ja eine Variable die der Klasse Student angehört, das könnte man als Objekt der Klasse bezcihnen, aber generell wärs interessant in welchem Kontext diese Begriffe vorkommen, weil ich sie irgendwie auch als mißverständlich empfinde...

@jens: Von mir aus gerne, bin grad nur zu faul, es selbst reinzusetzen (lohnt sich ja auch nich vor dem Strukturumbruch oder?)
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

henning hat geschrieben:@jens: Von mir aus gerne, bin grad nur zu faul, es selbst reinzusetzen (lohnt sich ja auch nich vor dem Strukturumbruch oder?)
Na, ich finde das es sich schon jetzt lohnt... Die Seiten werden in jedem Fall übernommen, wenn es zum Finalen Start kommt...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

Ein Klassenobjekt ist ein Objekt, das eine Klasse repräsentiert. In Python sind Klassen auch Objekte, in anderen Sprachen, wie zum Beispiel Java, sind Klassen keine Objekte sondern etwas statisches.

Eine Klasse ist so etwas wie ein Bauplan, oder eine Schablone für andere Objekte. So ein Objekt einer Klasse, oder besser eine Instanz oder ein Exemplar, kann durch "aufrufen" der Klasse erzeugt werden. Wenn man also eine Klasse `Student` hat, dann beschreibt die den "Bauplan" für einen Studenten und sein Verhalten. Aus dieser Klasse kann man dann konkrete `Student` Exemplare erzeugen.

Nochmal zu Klassen- und Instanzattributen: Klassenattribute sind meistens nur Methoden. Daten bindet man eher selten an eine Klasse. Meistens irgendwelche Konstanten. Im `Student` Beispiel könnte man aber zum Beispiel einen Matrikelnummer-Zähler in der Klasse unterbringen, der bei jedem erzeugten Studenten hochgezählt wird. So braucht man keine Nummern von Hand zu vergeben und ist sicher, das jeder (zumindest im laufenden Programm) eine neue Nummer bekommt:

Code: Alles auswählen

class Student:
    
    _next_matriculation_nr = 1
    
    def __init__(self, name):
        self.name = name
        self.matriculation_nr = Student._next_matriculation_nr
        Student._next_matriculation_nr += 1

    def __str__(self):
        return 'Name: %s, MatNr: %04d' % (self.name, self.matriculation_nr)

students = map(Student, ('Peter', 'Paul', 'Mary'))
for student in students:
    print student
Antworten