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.
Gast

wie kann man nur verbieten, ein Attribute zu überschreiben

Beitragvon Gast » Dienstag 12. Juli 2005, 17:10

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.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Dienstag 12. Juli 2005, 17:46

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 Modvoice
Gast

Danke vielmalas!

Beitragvon Gast » Dienstag 12. Juli 2005, 18:14

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

Frage zu Magikzeile

Beitragvon Gast » Dienstag 12. Juli 2005, 18:24

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

Beitragvon Gast » Dienstag 12. Juli 2005, 18:29

Hallo
irgendwie schief gelaufen. Ich die Tabelle gefunden:

4.9.2 Standard Encodings

Sorry für das Ungeschick!
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Re: Danke vielmalas!

Beitragvon Leonidas » Dienstag 12. Juli 2005, 18:31

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 Modvoice
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Re: Frage zu Magikzeile

Beitragvon Leonidas » Dienstag 12. Juli 2005, 18:35

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 Modvoice
BlackJack

Beitragvon BlackJack » Dienstag 12. Juli 2005, 22:42

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. ;-)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder