Seite 1 von 1

Setter und Getter in Objekten

Verfasst: Mittwoch 8. Oktober 2008, 10:33
von breathe_easy
Da ich nun schon mehrfach bzgl. Setter und Getter Funktionen gelesen und auch selbst "gerügt" worden bin, brauche ich alternative Möglichkeiten um auf Namen und Vornamen folgender Klasse zu zugreifen:

Code: Alles auswählen

class eintrag (object):
	
	def __init__ (self, name, vorname):
                self.name = name
		self.vorname = vorname

        def get_vorname (self):
                return self.vorname

        def get_name (self):
                return self.name

mitglieder.append(neuer_eintrag())
Alle Instanzen werden in einer Liste gespeichert und per Pickle serialisiert. Wie bekomme ich nun über mitglieder Zugriff auf die Attribute der Klasse?

Verfasst: Mittwoch 8. Oktober 2008, 10:40
von Leonidas
Suche im Forum und der Dokumentation nach "property".

Verfasst: Mittwoch 8. Oktober 2008, 10:40
von Pekh
Deine Einrückung ist wohl etwas durcheinander geraten. Ansonsten ist ja 'mitglieder' wohl eine Liste. Auf Elemente in Listen greifst du über den Index zu. Da das Element in diesem Fall vom Typ 'eintrag' sein dürfte, kannst du anschließend gleich mit '.name' weitermachen:

Code: Alles auswählen

mitglieder[2].name

Verfasst: Mittwoch 8. Oktober 2008, 10:41
von DasIch

Code: Alles auswählen

mitglieder[0].vorname
In diesem Fall sind getter und setter unnötig, wenn du sie wirklich brauchst nimm property.

Verfasst: Mittwoch 8. Oktober 2008, 10:49
von breathe_easy
Danke schön!

Verfasst: Mittwoch 8. Oktober 2008, 12:50
von Qubit
breathe_easy hat geschrieben:Danke schön!
Oder, wenn du etwas damit "spielen" willst ;-)

Code: Alles auswählen

class eintrag (object):
	import sys
	class selectAttr(Exception):
		def __init__(self, value):
			Exception.__init__(self, value)
		def case(self, value):
		   ecls, eobj, tb = eintrag.sys.exc_info()
		   if ecls is eintrag.selectAttr and eobj.args[0] == value:
			   return ecls
		   return None
	def __init__ (self, name, vorname):
		object.__setattr__(self,"name",name)
		object.__setattr__(self,"vorname",vorname)

	def __getattribute__(self, attr):
		s = eintrag.selectAttr(attr)
		try:
			raise s
		except s.case('vorname'):
			print "Get Vorname:"
			return object.__getattribute__(self,"vorname")
		except s.case('name'):
			print "Get Name:"
			return object.__getattribute__(self,"name")
		except:
			try:
				return object.__getattribute__(self,attr)
			except:
				return "ERROR: no attribute %s" % attr
	def __setattr__(self,attr,value):
		s = eintrag.selectAttr(attr)
		try:
			raise s
		except (s.case('vorname'), s.case('name')):
			print "ERROR: attribute %s protected" % attr
		except:
			print "Set %s to %s" % (attr,value)
			object.__setattr__(self,attr,value)

Verfasst: Mittwoch 8. Oktober 2008, 13:07
von rayo
Qubit hat geschrieben:Oder, wenn du etwas damit "spielen" willst ;-)
:shock: Hast du da ein Switch/Case Statement gebastelt? Das sieht ja schaurig aus.

Was willst du damit erreichen?

Gruss

Verfasst: Mittwoch 8. Oktober 2008, 13:20
von Qubit
rayo hat geschrieben:
Qubit hat geschrieben:Oder, wenn du etwas damit "spielen" willst ;-)
:shock: Hast du da ein Switch/Case Statement gebastelt? Das sieht ja schaurig aus.

Was willst du damit erreichen?
hehe..
reine Spielerei ;-)
Ein "Switch" würde ich eher so machen..

Code: Alles auswählen

def switch(case):
	return {
	1: 'a',
	2: 'b',
	3: 'c'}[case]