Seite 1 von 1
Klassen mit statischen Attributen ?
Verfasst: Donnerstag 27. September 2007, 14:40
von Goswin
Ich gebrauche eine instanzlose Klasse als Objektsammlung,
es sollen aber nur vorgegebene Namen definiert werden koennen.
Leider funktionier da keine __slots__-Anweisung,
da sich diese immer auf Instanzen bezieht.
Fehlgeschlagener Versuch:
Code: Alles auswählen
class Box(object):
__slots__ = ('erlaubt',)
def __init__(self):
raise 'Keine Instanzen bitte!'
#
Box.erlaubt = 2 #definiert 'erlaubt'
Box.verboten = 3 #definiert leider auch 'verboten'
Muss ich nun für jedes erlaubte Objekt
eine Klassenmethode set_erlaubtesobject(cls)
und eine Klassenmethode erlaubtesobject(cls) schreiben?
Edit (Leonidas): Thread "Test-Driven Development" abgesplittet.
Verfasst: Donnerstag 27. September 2007, 14:48
von mitsuhiko
Warum musst du Attribute verbieten? Python erwartet von dir, dass du selber aufpasst, dass du nichts setzt. __slots__ ist nicht dafür da, Attribute zu verbieten, sondern um das __dict__ von einem Objekt zu entfernen.
Ansonsten, eine Metaklasse:
Code: Alles auswählen
class Foo(object):
class __metaclass__(type):
__slots__ = ['foo']
Verfasst: Donnerstag 27. September 2007, 14:50
von EyDu
Darf man nachfragen, warum du keine Instanz der Klasse anlegen möchtest? Vielleicht gehst du das Problem ja nur verkehrt an. Soll "Box" nur einmal vorhanden sein, würde sich evtl. ein Singleton anbieten.
Vielen Dank
Verfasst: Donnerstag 27. September 2007, 17:28
von Goswin
(1)
blackbird: Attribute moechte ich gerne verbieten, weil ich mich oft falsch erinnere, welchen Abkürzung ich vor 6 Monaten für einen Begriff ausgewählt habe, und auf falsche Variablen so bald und so kategorisch wie möglich aufmerksam gemacht werden möchte. Vielleicht ist Python wirklich nichts für so zerstreute Menschen wie ich

. Ja, und dein Metaclass-Code stürzt leider ab mit der Meldung "nonempty __slots__ not supported for subtype of 'type' "
(2)
EyDu: Ich benutze jetzt die Singleton-Lösung aus "
http://snippets.dzone.com/tag/singleton":
Code: Alles auswählen
class Box(object):
__slots__ = ('erlaubt',)
def __new__(type):
if not '_einzige_Instanz' in type.__dict__:
type._einzige_Instanz = object.__new__(type)
return type._einzige_Instanz
Warum ich keine Instanzen anlegen wollte? Wohl nur der Einfachheit halber, und weil ich bis vor kurzem annahm, die Singleton-Lösung sei noch komplizierter. Und auch aus Abneigung zur lächerlichen Borg-Lösung, die unter Umständen Millionen von Instanzen mit denselben Eigenschaften anlegt. Es ist schon seltsam, dass eine Sprache wie Python, die auf Eleganz bedacht ist, sich bei einfachen Dingen wie statischen Attributen so schwer tut.
Re: Vielen Dank
Verfasst: Donnerstag 27. September 2007, 17:55
von lunar
Goswin hat geschrieben:(1) blackbird: Attribute moechte ich gerne verbieten, weil ich mich oft falsch erinnere, welchen Abkürzung ich vor 6 Monaten für einen Begriff ausgewählt habe, und auf falsche Variablen so bald und so kategorisch wie möglich aufmerksam gemacht werden möchte.
Dafür ist __slots__
nicht da! Wenn du __slots__ für diesen Zweck einsetzt, machst du etwas ganz grundsätzlich falsch.
Um Fehler mit falschen Namen aufzudecken, gibt es Code-Checker wie pylint oder pychecker. Bei größeren Projekten empfiehlt sich sowieso das schreiben von Unittests, die solche Fehler aufdecken.
Und vielleicht sollte man auch mal die eigenen Abkürzungen auf ihren Sinngehalt prüfen, und eventuell lieber aussagekräftige Namen nehmen.
Natürlich ist es ferner auch nie verkehrt, dass eigene Projekt vernünftig zu dokumentieren, so dass man bei eventuellen Fragen in späterer Zeit einfach die eigene Dokumentation durchgehen kann.
Vielleicht ist Python wirklich nichts für so zerstreute Menschen wie ich

.
Python ist schon das richtige für dich, wenn du die richtigen Werkzeuge einsetzt.
Re: Vielen Dank
Verfasst: Donnerstag 27. September 2007, 19:18
von gerold
Goswin hat geschrieben:Attribute moechte ich gerne verbieten, weil ich mich oft falsch erinnere, welchen Abkürzung ich vor 6 Monaten für einen Begriff ausgewählt habe, und auf falsche Variablen so bald und so kategorisch wie möglich aufmerksam gemacht werden möchte.
Hallo Goswin!
Die Lösung deiner Probleme. WingIDE
http://wingware.com/. WingIDE hat die beste Codevervollständigung für Python, die ich kenne. Beim Arbeiten mit WingIDE listet es dir z.B. sofort alle Attribute einer Klasse auf. Und wenn ein Attribut, das du eingibst, nicht aufgelistet wird, dann gibt es dieses Ding nicht. Also kannst du schon beim Eingeben des Codes darauf reagieren. Ohne WingIDE würde ich sicher nicht Python programmieren. Ich wäre nur ein Viertel so produktiv. Und wenn du wirklich so bist wie du dich gibst, dann zahlt es sich doppelt und dreifach aus, in WingIDE ein paar Euro zu investieren.
Weiters kannst du mit WingIDE deinen Code sehr komfortabel Schritt für Schritt debuggen.
Ich bin so einer, der nach ein paar Tagen schon nicht mehr weiß, was er in welchem Modul, in welcher Klasse und wie programmiert hat. Ohne eine gute IDE wäre ich komplett aufgeschmissen. Und viele machen den Fehler, dass sie nichts in eine funktionierende IDE für Python investieren. Und dann wundern sie sich, warum sie nicht so schnell auf eine Lösung kommen. Ich wäre *auch* langsam, wenn ich auf die API-Beschreibungen von Modulen angewiesen wäre, anstatt schon während dem Schreiben, Hilfe und Hinweise zu den aktuellen Funktionen und Methoden zu bekommen.
Ich habe auch am Anfang versucht, mit __slots__ die Falschschreibung von Attributnamen zu verhindern. Aber es ist nur ein Workarround, der dich mehr und mehr Zeit kostet, je größer dein Programm wird. Jede kleine Variable, die du an die Klasseninstanz binden willst, musst du während dem Programmieren in die __slots__-Liste nachtragen. Das wird immer umständlicher und umständlicher je größer deine Klassen werden. --> Vergiss es. Verlass dich lieber auf WingIDE, eine bewährte IDE mit der besten Codevervollständigung, die es für Python gibt.
mfg
Gerold
PS: Und auf diesen Beitrag hin, erwarte ich mir, dass ich die nächste WingIDE-Release gratis bekomme.

Haaaalllooo Wingware! Hört ihr mich?

Verfasst: Donnerstag 27. September 2007, 19:36
von Joghurt
gerold hat geschrieben:WingIDE hat die beste Codevervollständigung für Python, die ich kenne.
Da hast du recht. Es ist irgendwie schade, dass die beste IDE für eine freie Sprache eine proprietäre ist. Das ist wohl einer der wenigen Vorteile, die Java gegenüber Python bietet.
Warum Attributfixierung gut wäre
Verfasst: Dienstag 9. Oktober 2007, 09:25
von Goswin
Tja, jetzt ist es schon wieder passiert, dass ich gedankenverloren folgendes geschrieben habe:
anstelle von:
Un da ich die Zufallszahlen nicht sofort überprüft habe, merke ich ziemlich viel später, dass meine Rechnungen nun nicht reproduzierbar sind. Dies ist nur eins von vielen Beispielen wo es besser wäre, alle Attribute einer Klasse von vornherein festzuschreiben.
Ich weiß, dass __slots__ nicht dafür gemacht wurde. Aber wenn es zusätzlich unvorhergesehene Anwendungen findet, ist das doch etwas Gutes, die Umsetzer von __slots__ könnten stolz darauf sein!
Verfasst: Dienstag 9. Oktober 2007, 09:48
von BlackJack
Wenn Du das so siehst, solltest Du nicht in Python programmieren.
Den Fehler hätte man mit einem entsprechenden Test ganz schnell gefunden.
Verfasst: Dienstag 9. Oktober 2007, 10:08
von Goswin
Blackjack: Ich programmiere nicht deshalb in Python, weil Python perfekt ist oder ich es dafür halte. Ich kenne keine perfekte Programmiersprache, und mit einer Haltung wie du sie mir empfiehlst, könnte ich überhaupt nicht programmieren. Natürlich kann z.B. Java besser kapseln, aber dafür hat Java eben andere Nachteile. Nur, die Nachteile von Python wird man als Pythonprogrammierer doch wohl beim Namen nennen dürfen, und auch die beste Methode suchen dürfen, damit zu leben!
Verfasst: Dienstag 9. Oktober 2007, 11:07
von BlackJack
Das Problem ist, dass Du die Vorteile von Python als Nachteile siehst und damit gegen die Sprache programmierst statt mit ihr. Und wenn Du so gar nicht programmieren kannst, dann ist Python eben nicht die richtige Sprache für Dich.
Die beste Methode mit der dynamischen Natur von Python fertig zu werden ist nicht eine statische(re) Sprache daraus zu machen, sondern ein entsprechendes Entwicklungsmodell zu verwenden, zum Beispiel mit Unittests, eventuell sogar "test driven development" zu betreiben.
Verfasst: Dienstag 9. Oktober 2007, 12:06
von Leonidas
BlackJack hat geschrieben:dynamischen Natur von Python fertig zu werden
Seltsam, normalerweise werde ich immer fertig wenn ich statische Sprachen verwende, weil eben alle tollen dynamischen Gimmicks nicht mehr gehen.

Re: Klassen mit statischen Attributen ?
Verfasst: Dienstag 9. Oktober 2007, 13:49
von pyStyler
Hi,
dein problem!
Goswin hat geschrieben:
Code: Alles auswählen
class Box(object):
__slots__ = ('erlaubt',)
def __init__(self):
raise 'Keine Instanzen bitte!'
#
Box.erlaubt = 2 #definiert 'erlaubt'
Box.verboten = 3 #definiert leider auch 'verboten'
Muss ich nun für jedes erlaubte Objekt
eine Klassenmethode set_erlaubtesobject(cls)
und eine Klassenmethode erlaubtesobject(cls) schreiben?
die lösung?
Code: Alles auswählen
>>> class Box(object):
__slots__ = ('erlaubt')
def __getattr__(self, value):
return value
>>> b=Box()
>>> b.erlaubt = 2
>>> b.verboten = 3
Traceback (most recent call last):
File "<pyshell#7>", line 1, in <module>
b.verboten = 3
AttributeError: 'Box' object has no attribute 'verboten'
>>>
Gruss
pyStyler
Re: Vielen Dank
Verfasst: Dienstag 9. Oktober 2007, 17:39
von alan
Was mich an Wing IDE massiv stört, ist diese künstliche Unterscheidung zwischen Personal und Professional. Z.B. Code-Folding nur in der Professional finde ich schon etwas lächerlich. Ansonsten würde mich das schon irgendwie reizen...
Edit (Leonidas): Thread "Test-Driven Development" abgesplittet.