Classen & Objekte

Objektorientierte Skriptsprache: (python.org)
Antworten
sashpta
Beiträge: 104
Registriert: Fr Dez 12, 2014 2:55 pm

Classen & Objekte

Beitrag von sashpta » Fr Dez 02, 2016 9:34 pm

hey
ich habe mich mal wieder an Python rangewagt und habe jetzt angefangen OOP (in Python) zu lernen.
Das Buch mit dem ich Python lerne hat, dann diese Aufgabe gehabt,

Code: Alles auswählen

## ??
soll mit 'is-a' & 'has-a' ersetzt werden.

Allerdings steht in Zeile 2

Code: Alles auswählen

class Animal(object):
dazu hat der Autor geschrieben,

Code: Alles auswählen

## Animal is-a object (yes, sort of confusing) look at the extra credit
allerdings gibt es bei dem Buch keinen 'extra credit' und ich raffe nicht, warum Animal ein Objekt sein soll.
Vorher wird das Prinzip am Beispiel von einem Fisch erklärt:

Man hat einen Lachs, namens Mary.
Der Unterschied zwischen einem Lachs und Mary ist, dass Mary eine spezifische "Instanz" von einem Lachs ist. Mit Instanz ist gemeint, dass Mary auf der Basis von einem anderen Lachs "erstellt" wurde und jetzt etwas reales ist, dass Lachs-artige Eigenschaften besitzt.
Dann wird gesagt, dass ein Fisch eine Klasse ist, ein Lachs ist auch eine Klasse und Mary ist ein Objekt.
Ein Fisch ist eine Klasse, denn er ist nichts reales, eher ein Wort, dass wir benutzen um Dinge mit ähnlichen Eigenschaften zu beschreiben. -> Hat es Flossen? Hat es Kiemen? Lebt es im Wasser? Oke das ist wahrscheinlich ein Fisch.
Dann geht die Erklärung weiter, es kommt ein Ph.D. und sagt, "warte mal, dieser Fisch ist eigentlich ein Atlantischer Lachs, auch bekannt als Lachs." -> Der Professor hat den Fisch näher erläutert und somit eine neue Klasse namens "Lachs" erstellt, diese hat genauere Eigenschaften. Eine längerne Nase, rötliches Fleisch, groß, lebt in einem Ozean oder frischen Wasser, ist lecker? Wahrscheinlich ein Lachs.
Dann geht es weiter, es kommt ein Koch und sagt zu dem Ph.D. "Nein, siehst du diesen Lachs, ich nenne ihn Mary und ich werde ein leckeres Filet mit einer leckeren Soße aus ihm machen." Jetzt hat man eine Instanz von einem Lachs (welche auch eine Instanz von einem Fisch ist), genannt Mary. Es ist etwas reales geworden, dass deinen Bauch füllt. Es ist ein Objekt geworden.
Nun hat man dies: Mary ist eine Art von einem Lachs, dieser ist eine Art von einem Fisch. Object is a class is a class.
Also
Mary = Object
Lachs = Klasse
Fisch = Klasse

Das verstehe ich nun so, dass etwas allgemeines, eine allgemeine Kategorie eine Klasse ist, dann gibt es Unterkategorien, diese sind quasi Unterklassen und dann gibt es genauer definierte Dinge, das sind dann Objekte.
Also gibt es Häuser (Klasse), Hochhäuser(Unterklasse, also auch eine Klasse) und das Haus an der Hauptstraße XY in Ort XY (ein Objekt).
Oder habe ich das ganze mit Klassen und Objekte von Grund auf Falsch verstanden? :shock:

Wenn das alles so ist, wie ich das denke müsste "Animal" aber doch eine Klasse sein, ein Tier hat ja nichts spezifisches an sich... Warum ist es denn nun ein Objekt? :/


Wäre nice, wenn mir das mal jemand erklären könnte. :D


Hier noch der oben erwähnte Code:

Code: Alles auswählen

## Animal is-a object (yes, sort of confusing) look at the extra credit
class Animal(object):
    pass

## ??
class Dog(Animal):

    def __init__(self, name):
        ## ??
        self.name = name

## ??
class Cat(Animal):

    def __init__(self, name):
        ## ??
        self.name = name

## ??
class Person(object):

    def __init__(self, name):
        ## ??
        self.name = name

        ## Person has-a pet of some kind
        self.pet = None

## ??
class Employee(Person):

    def __init__(self, name, salary):
        ## ?? hmm what is this strange magic?
        super(Employee, self).__init__(name)
        ## ??
        self.salary = salary

## ??
class Fish(object):
    pass

## ??
class Salmon(Fish):
    pass

## ??
class Halibut(Fish):
    pass


## rover is-a Dog
rover = Dog("Rover")

## ??
satan = Cat("Satan")

## ??
mary = Person("Mary")

## ??
mary.pet = satan

## ??
frank = Employee("Frank", 120000)

## ??
frank.pet = rover

## ??
flipper = Fish()

## ??
crouse = Salmon()

## ??
harry = Halibut()

Schon mal Danke im Voraus. :D

nufan
Wiki-Moderator
Beiträge: 2557
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Classen & Objekte

Beitrag von nufan » Fr Dez 02, 2016 10:36 pm

Hallo! :)
Ich glaube du verstehst das Wort "object" in diesem Kontext etwas falsch.
sashpta hat geschrieben:Allerdings steht in Zeile 2

Code: Alles auswählen

class Animal(object):
dazu hat der Autor geschrieben,

Code: Alles auswählen

## Animal is-a object (yes, sort of confusing) look at the extra credit
allerdings gibt es bei dem Buch keinen 'extra credit' und ich raffe nicht, warum Animal ein Objekt sein soll.
Wie du an deinem Lachs-Beispiel schon erkannt hast, gibt es eine Klassen-Hierarchie. Lachs ist z.B. eine Unterklasse von Fisch. Damit bist du aber noch nicht an der Spitze dieses Hierarchie angelangt, dort steht nämlich die Klasse object. Der obige Code bedeutet also lediglich, dass der Typ Animal (auch) die Eigenschaften des Typs object besitzt.

Noch als Anmerkung:
sashpta hat geschrieben:Der Unterschied zwischen einem Lachs und Mary ist, dass Mary eine spezifische "Instanz" von einem Lachs ist. Mit Instanz ist gemeint, dass Mary auf der Basis von einem anderen Lachs "erstellt" wurde und jetzt etwas reales ist, dass Lachs-artige Eigenschaften besitzt.
Die Formulierung "auf der Basis von einem anderen Lachs" ist etwas schwammig. Es gibt einen Typ, eine Klasse, eine Schablone, eine Defintion - wie auch immer du es nennen willst - mit dem Namen Lachs. Eine Klasse speichert selbst keine Eigenschaften wie etwa das Gewicht eines Lachses, sondern lediglich die Definition welche Eigenschaften ein Lachs besitzt. Ein konkretes Objekt das genau nach dieser Definition aufgebaut ist wird Instanz genannt.

sashpta
Beiträge: 104
Registriert: Fr Dez 12, 2014 2:55 pm

Re: Classen & Objekte

Beitrag von sashpta » Fr Dez 02, 2016 10:43 pm

nufan hat geschrieben:Hallo! :)
Wie du an deinem Lachs-Beispiel schon erkannt hast, gibt es eine Klassen-Hierarchie. Lachs ist z.B. eine Unterklasse von Fisch. Damit bist du aber noch nicht an der Spitze dieses Hierarchie angelangt, dort steht nämlich die Klasse object. Der obige Code bedeutet also lediglich, dass der Typ Animal (auch) die Eigenschaften des Typs object besitzt.
Also gibt es neben den Klassen und Objekten noch ein Objekt was über allem steht oder wie ist das zu verstehen?
Die Formulierung "auf der Basis von einem anderen Lachs" ist etwas schwammig. Es gibt einen Typ, eine Klasse, eine Schablone, eine Defintion - wie auch immer du es nennen willst - mit dem Namen Lachs. Eine Klasse speichert selbst keine Eigenschaften wie etwa das Gewicht eines Lachses, sondern lediglich die Definition welche Eigenschaften ein Lachs besitzt. Ein konkretes Objekt das genau nach dieser Definition aufgebaut ist wird Instanz genannt.
Also Klasse beim Beispiel Fisch = Besitzt Kiemen, Flossen, Augen, Mund, lebt im Wasser, schwimmt
Objekt: Besitzt 3 Kiemen, 2 Flossen, 2 Augen, einen Mund, lebt in Salzwasser, wiegt 10 Kilo
oder hab ich da wieder nen Fehler?

nufan
Wiki-Moderator
Beiträge: 2557
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Classen & Objekte

Beitrag von nufan » Fr Dez 02, 2016 10:58 pm

sashpta hat geschrieben:
nufan hat geschrieben:Hallo! :)
Wie du an deinem Lachs-Beispiel schon erkannt hast, gibt es eine Klassen-Hierarchie. Lachs ist z.B. eine Unterklasse von Fisch. Damit bist du aber noch nicht an der Spitze dieses Hierarchie angelangt, dort steht nämlich die Klasse object. Der obige Code bedeutet also lediglich, dass der Typ Animal (auch) die Eigenschaften des Typs object besitzt.
Also gibt es neben den Klassen und Objekten noch ein Objekt was über allem steht oder wie ist das zu verstehen?
Es gibt Eigenschaften die jedes Objekt haben soll. Deswegen gibt es eine Klasse object an der Spitze deiner Hierarchie (also z.B. über Fisch und Animal), dessen Beschreibung alle Unterklassen übernehmen.
sashpta hat geschrieben:
Die Formulierung "auf der Basis von einem anderen Lachs" ist etwas schwammig. Es gibt einen Typ, eine Klasse, eine Schablone, eine Defintion - wie auch immer du es nennen willst - mit dem Namen Lachs. Eine Klasse speichert selbst keine Eigenschaften wie etwa das Gewicht eines Lachses, sondern lediglich die Definition welche Eigenschaften ein Lachs besitzt. Ein konkretes Objekt das genau nach dieser Definition aufgebaut ist wird Instanz genannt.
Also Klasse beim Beispiel Fisch = Besitzt Kiemen, Flossen, Augen, Mund, lebt im Wasser, schwimmt
Objekt: Besitzt 3 Kiemen, 2 Flossen, 2 Augen, einen Mund, lebt in Salzwasser, wiegt 10 Kilo
oder hab ich da wieder nen Fehler?
Ich würde sagen du hast das Grundprinzip verstanden. Bei einigen Werten solltest du überlegen ob du die nicht bereits in der Klasse fix angeben kannst, z.B. die Anzahl der Augen sehe ich nicht unbedingt als variablen Wert an ;)

sashpta
Beiträge: 104
Registriert: Fr Dez 12, 2014 2:55 pm

Re: Classen & Objekte

Beitrag von sashpta » Sa Dez 03, 2016 12:06 am

nufan hat geschrieben: Es gibt Eigenschaften die jedes Objekt haben soll. Deswegen gibt es eine Klasse object an der Spitze deiner Hierarchie (also z.B. über Fisch und Animal), dessen Beschreibung alle Unterklassen übernehmen.
Dann stellen sich mir aber ein paar Fragen, warum nennt man das Ding 'object' das ist richtig verwirrend gemacht (zumindest für Leute die sich damit nicht großartig auskennen....)
Und warum ist 'Animal' in

Code: Alles auswählen

 class Animal(object): 
ein Object während 'Test' in

Code: Alles auswählen

class Test(abc):
eine Klasse ist. Oder ist das so, dass Animal kein Object an sich ist sonder dieses andere Object? Also, was ich meine ist, nennen wir z.B. dieses andere Object was über allem steht mal 'Wand', also wenn ich schreibe

Code: Alles auswählen

class Animal(Wand):
dann haben wir quasi folgendes: Make a class named Animal that is-a Wand. Genauso, wie wenn wir

Code: Alles auswählen

class Test(abc):
machen und dann folgendes haben: Make a class named Test that is-a abc.
also ist das 'object'( dass bei "class Animal(object)" in Klammern ist) kein Objekt in dem Sinne es gibt Objekte und Klassen, sonder es ist so wie 'abc'. Somit ist es einfach unglücklich gelaufen, dass das Ding auch Object heißt. Ich hoffe mein Gedankengang hier ist mehr oder weniger verstäandlich. :D
Und wenn dem so ist, dann ist hier

Code: Alles auswählen

class Tor(object):
quasi das 'object' kein Platzhalter für ein Objekt (ein Objekt im Sinne von Klassen und Objekte), sonder es ist so gemeint wie 'abc' im Beispiel von eben.
Ich hoffe das ist irgendwie verständlich, aber es ist letzten Endes so, dass das object in den Klammern hinter nem Klassennamen nicht das selbe Objekt ist, wie die Objekte wenn man von Objekte und Klassen spring oder?
Ich würde sagen du hast das Grundprinzip verstanden. Bei einigen Werten solltest du überlegen ob du die nicht bereits in der Klasse fix angeben kannst, z.B. die Anzahl der Augen sehe ich nicht unbedingt als variablen Wert an ;)
Achso man macht alles was (normalerweise) bei allem gleich ist in eine Klasse und die Dinge, die sich fast immer von Individuum (wenn mans auf Lebewesen bezieht) zu Individuum ändern in ein Objekt?

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Classen & Objekte

Beitrag von Xin » Sa Dez 03, 2016 7:25 pm

sashpta hat geschrieben:
nufan hat geschrieben: Es gibt Eigenschaften die jedes Objekt haben soll. Deswegen gibt es eine Klasse object an der Spitze deiner Hierarchie (also z.B. über Fisch und Animal), dessen Beschreibung alle Unterklassen übernehmen.
Dann stellen sich mir aber ein paar Fragen, warum nennt man das Ding 'object' das ist richtig verwirrend gemacht (zumindest für Leute die sich damit nicht großartig auskennen....)
Klassen klassifizieren "Dinge".
Ein Objekt ist schlussendlich ein anderes Wort für "Ding". Es gibt also eine Klasse "Ding", die man object genannt hat. Da alles irgendwie ein Ding ist, also ein Objekt, kann man sagen "Ein Tier ist ein Objekt", genauso wie "Ein Auto ist ein Objekt". Die Aussage hat im Prinzip keinen großen Wert, aber man kann daran die Objekthierarchie aufbauen.
Eine Funktion, der also egal ist, was sie an Daten bekommt, kann etwas(!) verlangen, was als ein "object" klassifiziert ist.

Wichtig ist hier der Unterschied zwischen "als klassifiziert sein" - dabei handelt es sich um den Datentyp - und der tatsächlichen Instanz. Wir können über Autos philosophieren ohne ein Auto zu besitzen. Aber vielleicht steht von Dir auch ein Blechhaufen, eine greifbare Instanz eines Objektes, das man als Auto klassifiziert hat.
sashpta hat geschrieben: Und warum ist 'Animal' in

Code: Alles auswählen

 class Animal(object): 
ein Object während 'Test' in

Code: Alles auswählen

class Test(abc):
eine Klasse ist.
Eine Klasse ist immer ein Datentyp mit einem Namen. Ein Ding, was man als Animal klassifizieren kann, kann man auch als objekt klassifizieren, weil mit class Animal(object) festgelegt wurde, dass ein Animal ein object ist.

Die Ableitung class Test(abc) verstehe ich nicht... das müsste eher umgekehrt sein: class abc(Test), dann würde es bedeuten, dass abc als Test klassifiziert wird.
sashpta hat geschrieben:Oder ist das so, dass Animal kein Object an sich ist sonder dieses andere Object? Also, was ich meine ist, nennen wir z.B. dieses andere Object was über allem steht mal 'Wand', also wenn ich schreibe

Code: Alles auswählen

class Animal(Wand):
dann haben wir quasi folgendes: Make a class named Animal that is-a Wand. Genauso, wie wenn wir

Code: Alles auswählen

class Test(abc):
machen und dann folgendes haben: Make a class named Test that is-a abc.
also ist das 'object'( dass bei "class Animal(object)" in Klammern ist) kein Objekt in dem Sinne es gibt Objekte und Klassen, sonder es ist so wie 'abc'. Somit ist es einfach unglücklich gelaufen, dass das Ding auch Object heißt. Ich hoffe mein Gedankengang hier ist mehr oder weniger verstäandlich. :D
Bin mir da nicht sicher, ob ich dem Folgen kann.
"object" heißt schon ziemlich absichtlich "object".
sashpta hat geschrieben:Ich hoffe das ist irgendwie verständlich, aber es ist letzten Endes so, dass das object in den Klammern hinter nem Klassennamen nicht das selbe Objekt ist, wie die Objekte wenn man von Objekte und Klassen spring oder?
Jaein... wie gesagt... man muss zwischen der Klasse "object" unterscheiden und dem eigentlich (greifbaren) Objekt, dass man als "object" klassifiziert hat. class object oder class Animal(object) ist nur der Datentyp. Es ist eine Beschreibung (Klassifizierung) der Daten und Eigenschaften, die ein Objekt (das dieser Klassifizierung entspricht) besitzt.
sashpta hat geschrieben:Achso man macht alles was (normalerweise) bei allem gleich ist in eine Klasse und die Dinge, die sich fast immer von Individuum (wenn mans auf Lebewesen bezieht) zu Individuum ändern in ein Objekt?
Man beschreibt in der Klasse, in welchen Dingen sich die einzelnen individuellen Instanzen unterscheiden. Eine Klasse "Bitmap" beschreibt, wie ein Bild im Speicher abgelegt werden kann. Nun sind nicht alle Bilder gleich, sie haben beispielsweise unterschiedliche Breiten und Höhen - manche sind also klein, andere größer. Trotzdem sind alle Bilder als "Bitmap" klassifiziert.
Die Klasse selbst hat dann Eigenschaften, die für jede Instanz individuell sind: eben Breite und Höhe und die Information, wo die Roh-Daten für das Bild im Speicher liegen.

Die Klasse wird einmalig beschrieben und das Datenlayout kann dann für alle individuellen Instanzen wiederverwendet werden.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

sashpta
Beiträge: 104
Registriert: Fr Dez 12, 2014 2:55 pm

Re: Classen & Objekte

Beitrag von sashpta » So Dez 04, 2016 8:44 pm

Xin hat geschrieben:Bin mir da nicht sicher, ob ich dem Folgen kann.
"object" heißt schon ziemlich absichtlich "object".
ja schon klar aber, wenn ich schreibe

Code: Alles auswählen

class Animal(object):
und

Code: Alles auswählen

class abc(Test):
dann ist beides in Klammern ein Objekt oder? somit wär das Objekt bei Animal (object) nicht das selbe wie Test bei abc, obwohl beide Objekte sind.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Classen & Objekte

Beitrag von Xin » So Dez 04, 2016 9:52 pm

sashpta hat geschrieben:
Xin hat geschrieben:Bin mir da nicht sicher, ob ich dem Folgen kann.
"object" heißt schon ziemlich absichtlich "object".
ja schon klar aber, wenn ich schreibe

Code: Alles auswählen

class Animal(object):
und

Code: Alles auswählen

class abc(Test):
dann ist beides in Klammern ein Objekt oder? somit wär das Objekt bei Animal (object) nicht das selbe wie Test bei abc, obwohl beide Objekte sind.
Du baust eine Hierarchie.
Du sagst, dass ein Animal ein Objekt ist und dass abc ein Test ist.
Aber wenn Du schaust, was Test ist, dann wirst Du feststellen, dass in der Hierarchie darüber steht, dass Test auch ein Objekt ist. Also ist abc auch ein Objekt, genauso wie Cat ein Objekt ist, wenn es von Animal abgeleitet ist, da Animal ja ein Objekt ist.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

sashpta
Beiträge: 104
Registriert: Fr Dez 12, 2014 2:55 pm

Re: Classen & Objekte

Beitrag von sashpta » So Dez 04, 2016 10:36 pm

also schreibe ich in

Code: Alles auswählen

class Animal(object)
das 'object' nur, weil die Klammer nicht leer sein soll.
und jede andere Klasse die ich erstellte hat quasi, ich sag mal 'automatisch' dieses 'object' (das was wir in class Animal(object) ) ?

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Classen & Objekte

Beitrag von Xin » So Dez 04, 2016 11:52 pm

sashpta hat geschrieben:also schreibe ich in

Code: Alles auswählen

class Animal(object)
das 'object' nur, weil die Klammer nicht leer sein soll.
Interessante Frage - ich bin kein Python-Guru (und auch ausreichend weit entfernt davon, einer zu sein).

So wie ich das sehe musst Du nicht von object ableiten.

Code: Alles auswählen

class Animal: 
düfte reichen...

Aaaber: Siehe hier... die Klammern unterscheiden in Python 2 alte und neue Objekte.
Moderne Objekte erfordern mehr Tipparbeit :)
Oder man nimmt Python 3.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten