wie kann man nur verbieten, ein Attribute zu überschreiben

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
Gast

Hallo zusammen,

ich habe den folgenden Code, um Überschreiben von Attribute zu verbieten (Python version 2.4.1). Aber man kann trotzdem ein neuen Wert vergeben.

Bitte um Hilfe oder Vorschläge!

MfG

Code: Alles auswählen

class D:
	def __init__(self, name):
		self.__strs = name
	def getMyString(self):
		return self.__strs
		
	def setMyString(self, value):
		raise AttributeError, "Can't set Attribute"
	
	myString = property(getMyString, setMyString)

if __name__ == "__main__":
	tobj=D("hello")
	strs = "myString"
	setattr(tobj, strs, "Hello Again")
	print "als Attribute : %s " % getattr(tobj, strs)
Edit (Leonidas): Code in Python-Tags gesetzt.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ist doch kein Problem:

Code: Alles auswählen

#!/usr/bin/env python
# -*- encoding: latin-1 -*-

class D(object):
    def __init__(self, name):
        self.__strs = name
        
    def get_my_string(self):
        return self.__strs
       
    def setMyString(self, value):
        raise AttributeError, "Can't set Attribute"
   
    MyString = property(get_my_string, None, None, '')

if __name__ == "__main__":
    tobj = D("hello")
    strs = "MyString"
    setattr(tobj, strs, "Hello Again")
    print "als Attribute : %s " % getattr(tobj, strs)
So Tricks gehen aber nur mit New-Style-Klassen, deswegen erbe ich von object.

Aber ich finde das das Verbieten des Schreibens eher unpythonic ist und ziemlich Java-like.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Gast

Hallo Leonidas,

vielen Dank für die Lösung.

Ich bin Anfänger mit Python, so wollte ich mit dem neuen Klassenstil probieren. Mit dem alten __setattr__ / __getattr__ funktioniert das Verhindern.

BTW, ich habe so gedacht, dass alle Klassen von object abgeleitet wurde, wenn man nicht explizit angegeben hat. Aber du sagst, die Verbung von object ist ein Trick, bitte um genaue Erläuterung, wenn du irgendwann Zeit hast.
Gast

Hallo Leonidas,

ich habe bei deinem Script die latin-1 gesehen, aber ich habe irgendwo im Buch die folgende Zeile
# -*- coding: iso-8859-1 -*-

die auch Deutsch interpretieren kann.

gibt es eine Liste, für welche Sprache welche eingetragen werden soll

vielen Dank für einen Tipp!

mfg
Gast

Hallo
irgendwie schief gelaufen. Ich die Tabelle gefunden:

4.9.2 Standard Encodings

Sorry für das Ungeschick!
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Anonymous hat geschrieben:Ich bin Anfänger mit Python, so wollte ich mit dem neuen Klassenstil probieren. Mit dem alten __setattr__ / __getattr__ funktioniert das Verhindern.
Ja probieren ist okay, aber ich muss sagen, dass ich das Verhindern noch nie benutzt habe. Nur Properties erscheinen mir sinnvoll, die sind ganz in Ordnung.
Anonymous hat geschrieben:BTW, ich habe so gedacht, dass alle Klassen von object abgeleitet wurde, wenn man nicht explizit angegeben hat. Aber du sagst, die Verbung von object ist ein Trick, bitte um genaue Erläuterung, wenn du irgendwann Zeit hast.
Es ist so: seit Python 2.2.1 (.1 war es, denke ich) gibt es eine Unterscheidung zwischen New-Style-Klassen und Old-Style Klassen. Um alten Code nicht zu brechen sind alle Klassen per default Old-Style Klassen und verhalten sich so wie z.B. in Python 2.1. Dann wurden New-Style-Klassen erstellt, über die man weitaus mehr Kontrolle hat. Alle Klassen die von New-Style Klassen erben werden automatisch zu New-Style Klassen, wie zum Beispiel wenn man von list oder file erben will. Nun hat noch eine 'leere' New-Style Klasse gefehlt von der man hätte erben können. Somit wurde object erstellt. Object macht nichts, es ist einfach ein e New-Style Klasse von der man erbt um eine leere New-Style Klasse zu bekommen. Die Bezeichnung "Trick" ist von mir etwas unglücklich gewählt, denn das macht man in Python halt so (und das ist meines Erachtens auch kein Probelm).
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Anonymous hat geschrieben:ich habe bei deinem Script die latin-1 gesehen, aber ich habe irgendwo im Buch die folgende Zeile
# -*- coding: iso-8859-1 -*-

die auch Deutsch interpretieren kann.

gibt es eine Liste, für welche Sprache welche eingetragen werden soll
Du hast es ja schon gefunden.. ISO-8859-1 ist latin-1.. für Deutsch wäre noch ISO-8859-15 geeignet, das enthält auch den Euro.

Oder halt UTF :)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

Ich denke auch, das etwas hart verbieten zu wollen ziemlich unpythonic ist. Properties sind dazu gedacht das man mit dem Wert, den man da setzt/holt noch irgendetwas machen kann, nicht um das Attribut vor Zugriffen zu schützen.

Ausserdem solltest Du Dir den doppelten Unterstrich abgewöhnen oder sehr gut überlegen. Ein einfacher reicht aus um Lesern zu sagen "Finger weg, das ist intern" und den "Schutz" von doppelten Unterstrichen kann man wenn man möchte auch ganz einfach aushebeln.

Eine gute Sache, die Python von Perl übernommen hat (ja, auch das gibt es), ist die Einstellung, das man beim Nachbarn nicht in den Schubladen herumwühlt weil der eine Schrotflinte hat, sondern weil man selbst weiss was sich gehört. ;-)
Antworten