cookie: (PYTHON) Class und __getitem__

Hi,

ich stecke gerade fest:

---

class MyClass:
    abc = ['a', 'b', 'c']
    numbers = [1, 2, 3]

def __getitem__(self, abc):
        return self.abc
    def __getitem__(self, numbers):
        return self.numbers

my_object = MyClass()
print "abc: ", my_object['abc']
print "numbers:", my_object['numbers']

---

Dieses Python-Programm sollte meiner Meinung nach eigentlich Folgendes ausgeben:

abc: ['a', 'b', 'c']
numbers: [1, 2, 3]

Aber stattdessen kommt:

abc: [1, 2, 3]
numbers: [1, 2, 3]

Warum? Was mache ich falsch?

Danke!
cookie

  1. Kurtz gegrüßt

    ich kann kein Python, aber offensichtlich

    def __getitem__(self, abc):
            return self.abc
        def __getitem__(self, numbers):
            return self.numbers

    überschreibst du hier __getitem__ !

    Grüße
     Kurt

    1. Hi,

      ich glaube, Du hast mich auf die richtige Idee gebracht. Ich hatte das Problem bei __getitem__ gesucht, weil ich dachte, ich hätte dessen Funktionsweise noch nicht ganz durchdrungen, aber offenbar wird durch die zweite Definition von __getitem__ tatsächlich die erste "überschrieben". Ich habe das jetzt so gelöst:

      class MyClass:
          abc = ['a', 'b', 'c']
          numbers = [1, 2, 3]

      def __getitem__(self, item):
              if item == 'abc':
                  return self.abc
              if item == 'numbers':
                  return self.numbers

      my_object = MyClass()
      print "abc:", my_object['abc']
      print "numbers:", my_object['numbers']

      mit dem erwarteten Ergebnis:
      abc: ['a', 'b', 'c']
      numbers: [1, 2, 3]

      Also nochmal vielen Dank!

      Grüße
      cookie

      1. Kurtz gegrüßt

        Also nochmal vielen Dank!

        nichts zu danken, wir Perlistas helfen doch gerne aus. 8-)

        Grüße
         Kurt

        PS: Python hat auch __getattribute__, aber ich vermute das geht auf Instanzvariablen während Items Klassenvariablen sein sollen !(?)

        1. Hallo,

          nichts zu danken, wir Perlistas helfen doch gerne aus. 8-)

          ach, weißt Du, ich hatte lange überlegt, welche Skriptsprache ich am besten lernen sollte, und natürlich war auch Perl in den Überlegungen drin. Python habe ich dann irgendwann mehr oder weniger aus allgemeinen Erwägungen gewählt, und weil man sich irgendwann einfach entscheiden muss, um auch mal richtig was lernen zu können.
          Wenn man bei den ersten Problemen immer gleich aufgibt und sagt, naja, eine andere Sprache wäre vielleicht einfacher, ich kuck mal, was es noch gibt, dann wechselt man ständig und kommt gar nicht mehr dazu, die Sprache auch richtig zu *benutzen*, so wie ich es jetzt auch schon ein bisschen versuche.
          Meine Frage entstand nämlich aus einem kleinen eigenen Projekt, bei dem ich nicht weiterkam. Bei meinen näheren Untersuchungen kam dann das kleine Codebeispiel heraus, das ich dann hier zur Diskussion gestellt hatte.
          Und inzwischen kann ich weiterbasteln. ;-)

          PS: Python hat auch __getattribute__, aber ich vermute das geht auf Instanzvariablen während Items Klassenvariablen sein sollen !(?)

          So weit bin ich selbst noch nicht, werde ich aber bestimmt bald kennenlernen! ;-)

          Viele Grüße
          cookie

          1. Kurtz gegrüßt

            Python habe ich dann irgendwann mehr oder weniger aus allgemeinen Erwägungen gewählt, und weil man sich irgendwann einfach entscheiden muss, um auch mal richtig was lernen zu können.

            du da bin ich emotionslos, beide Sprachen haben ihre Stärken und Schwächen ... (und ich geh nicht weiter ins Detail :)

            Grüße
             Kurt

        2. Hallo Kurt,

          PS: Python hat auch __getattribute__, aber ich vermute das geht auf Instanzvariablen während Items Klassenvariablen sein sollen !(?)

          Die Methoden __getitem__, __setitem__ und __delitem__ sind für die Emulierung von Datenstrukturzugriff wie bei Listen, Tupeln oder Dictionaries da, d.h. dings[key]. Man kann damit einfach klassische Datenstrukturen nach außen hin uniform gestalten, während die Implementierung wie auch immer sein kann.

          __getattribute__, __getattr__*, setattr__, __delattr__ dagegen sind für Attribute eines Objektes da, d.h. dings.key wird also zu dings.__getattribute__(key). __getattr__ im Gegensatz zu __getattribute__ wird erst nach dem Suchen im Objekt und in der Vererbungshierarchie aufgerufen, ist also vergleichbar mit Rubys method_missing. Das kann manchmal ganz praktisch sein, wenn der Methodenname irgendwohin weiter gereicht wird, das Objekt also ein Proxy ist. Z.b. in XML-RPC oder in diesem zufällig aus Google gefischten Flickr-API-Client.

          Tim

          --
          Nach self das Nervigste an Python: Die __Unterstriche__!
          1. Hallo Tim,

            Die Methoden __getitem__, __setitem__ und __delitem__ sind für die Emulierung von Datenstrukturzugriff wie bei Listen, Tupeln oder Dictionaries da, d.h. dings[key]. Man kann damit einfach klassische Datenstrukturen nach außen hin uniform gestalten, während die Implementierung wie auch immer sein kann.

            OK also in Perlterminologie ein Tie auf ein Array oder nen Hash!

            __getattribute__, __getattr__*, setattr__, __delattr__ dagegen sind für Attribute eines Objektes da, d.h. dings.key wird also zu dings.__getattribute__(key).

            Mutatoren.

            __getattr__ im Gegensatz zu __getattribute__ wird erst nach dem Suchen im Objekt und in der Vererbungshierarchie aufgerufen, ist also vergleichbar mit Rubys method_missing.

            OK, für Methoden wärs AUTOLOAD in Perl.

            werden in Python auch Attribute vererbt???

            Dank dir Tim, deine Posts sind echt mehr Wert als ein ganzer Thread beim deutschen Python Forum!!! : )

            Grüße
             Kurt