ich wollte dir klar machen, daß du klassenattribute und attribute von instanzen, auch wenn beim lesenden Zugriff scheinbar kein Unterschied ist, dieses doch 2 völlig verschiedene Sachen sind.
Du erreichst keine Instanzen indem du Klassenattribute änderst, sondern über die Instanzen hast du zugriff auf Klassenattribute!!!
Solange dir dieses nicht klar ist, ist eine weitere Diskussion sinnlos.
Gruß
Dookie
besser so oder so?
also gut!
klasse A. attribut - wert
instanz a greit auf diesen wert zu.
klasse A. attribut - geänderter wert.
instanz a greift auf diesen wert zu.
der ursprgl. wert ist nicht mehr erreichbar.
somit repräsentiert der verweis a ein objekt mit einem attribut dessen wert geändert wurde.
was stimmt daran nicht?
ob du es von dieser seite oder jener seite angehst: fakt ist, beim aufruf a.attribut, kommt nach der änderung der geänderte wert.
mfg
rolgal
klasse A. attribut - wert
instanz a greit auf diesen wert zu.
klasse A. attribut - geänderter wert.
instanz a greift auf diesen wert zu.
der ursprgl. wert ist nicht mehr erreichbar.
somit repräsentiert der verweis a ein objekt mit einem attribut dessen wert geändert wurde.
was stimmt daran nicht?
ob du es von dieser seite oder jener seite angehst: fakt ist, beim aufruf a.attribut, kommt nach der änderung der geänderte wert.
mfg
rolgal
-
- Python-Forum Veteran
- Beiträge: 2010
- Registriert: Freitag 11. Oktober 2002, 18:00
- Wohnort: Salzburg
- Kontaktdaten:
was daran nicht stimmt ist, das A.irgendwas kein attribut von a sondern ein attribut von A ist, a.irgendwas wird zu A.irgendwas umgeleitet. Funktioniert also wie ein Alias. Und es ist nicht egal von welcher Seite du es siehst, wenn Du in einen Lautsprecher reinsingst, kommt beim Microfon ja auch kein Ton heraus.
Gruß
Dookie
Gruß
Dookie
Hi. Du sagst es: Verweise, Referenzen. Es sind nun mal Klassenatrribute und die sind für alle Instanzen immer gleich. Das durch Eingriffe darin rumgepfuscht werden kann ist klar und deswegen auch, dass man darauf aufpassen sollte (nun merkst du ja selber warum). Es herrscht Identität zwischen Klassenattributen.
Deswegen hat das auch gar nix mit __slots__ zu tun, da das nur dafür da ist, das keine neuen Attribute hinzugefügt werden können, es schützt nicht vor Änderung bestehender Attribute (wie du in der Docu lesen kannst).
Warum du nun also schreibenden Zugriff auf die Klassenattribute hast, musst du die Pythonentwickler fragen. Es ist jedenfalls in der Sprachphilosophie verankert, dass man offener zugreifen darf als anderswo. Das war auch der Grund, wesegen Dookie und ich stark gegen einen offenen Zugriff aus "Lust und Laune" argumentiert haben, wenn es nicht anders geht. Hier könntest du aber auch eine große Ausnahme machen, wenn du a) den Quellcode kennst und b) gerade diese Identität als nützliches Mittel erwünscht ist. Man kann damit technische Kunstgriffe machen, sollte es aber als Ausnahme behandeln und möglichst andere Wege gehen.
Milan
Deswegen hat das auch gar nix mit __slots__ zu tun, da das nur dafür da ist, das keine neuen Attribute hinzugefügt werden können, es schützt nicht vor Änderung bestehender Attribute (wie du in der Docu lesen kannst).
Warum du nun also schreibenden Zugriff auf die Klassenattribute hast, musst du die Pythonentwickler fragen. Es ist jedenfalls in der Sprachphilosophie verankert, dass man offener zugreifen darf als anderswo. Das war auch der Grund, wesegen Dookie und ich stark gegen einen offenen Zugriff aus "Lust und Laune" argumentiert haben, wenn es nicht anders geht. Hier könntest du aber auch eine große Ausnahme machen, wenn du a) den Quellcode kennst und b) gerade diese Identität als nützliches Mittel erwünscht ist. Man kann damit technische Kunstgriffe machen, sollte es aber als Ausnahme behandeln und möglichst andere Wege gehen.
Milan
du hast schon recht, dass ich das genauer formulieren muss.
das ergebnis ist im gegensatz zu deinem vergleich mit dem lautsprecher doch das gleiche.
a.attribut gibt mir das zurück was ich in der klasse definiert habe.
warum also __slots__ wenn, abgesehen davon ob es sinn macht oder nicht, ich das was a.attribut zurückgibt so leicht beeinflussen kann.
ist das so unklar was ich meine ?
wenn ich etwas implementiere um es zu schützen, dann muss ich es schon richtig dicht machen.
mir kommt __slots__ (ist ja für was anderes auch noch gut) so vor, als würde ich meine gitarre in einen koffer sperren und auf den koffer draufschreiben wo der schlüssel ist.
oder so ähnlich.
mfg
rolgal
das ergebnis ist im gegensatz zu deinem vergleich mit dem lautsprecher doch das gleiche.
a.attribut gibt mir das zurück was ich in der klasse definiert habe.
warum also __slots__ wenn, abgesehen davon ob es sinn macht oder nicht, ich das was a.attribut zurückgibt so leicht beeinflussen kann.
ist das so unklar was ich meine ?
wenn ich etwas implementiere um es zu schützen, dann muss ich es schon richtig dicht machen.
mir kommt __slots__ (ist ja für was anderes auch noch gut) so vor, als würde ich meine gitarre in einen koffer sperren und auf den koffer draufschreiben wo der schlüssel ist.
oder so ähnlich.
mfg
rolgal
-
- Python-Forum Veteran
- Beiträge: 2010
- Registriert: Freitag 11. Oktober 2002, 18:00
- Wohnort: Salzburg
- Kontaktdaten:
Hi rolgal,
__slots__ gibt die Anzahl und die Namen der Seiten einer Gitarre an. Jede Gitarre dieses Typs hat genau die Anzahl Seiten und diese haben die Namen die in __slots__ definiert sind. Du kannst nicht wahllos Seiten hinzugeben. Kannst aber auch mal eine Seite erneuern, also ihr einen neuen Wert zuweisen.
In der Gitarre klebt ein Zettelchen, mit dem Hersteller und dessen Webseite oder Emailadresse. Wenn nun der Hersteller in seiner Firma im Lager Holz aus Neuguinea bekommt, so bekommt der Herstellers ein neues Attribut, über den Zettel in der Gitarre könntest Du nun auf dieses neue Attribut des herstellers zugreifen, aber die Gitarre selber ändert sich dadurch nicht.
Gruß
Dookie
__slots__ gibt die Anzahl und die Namen der Seiten einer Gitarre an. Jede Gitarre dieses Typs hat genau die Anzahl Seiten und diese haben die Namen die in __slots__ definiert sind. Du kannst nicht wahllos Seiten hinzugeben. Kannst aber auch mal eine Seite erneuern, also ihr einen neuen Wert zuweisen.
In der Gitarre klebt ein Zettelchen, mit dem Hersteller und dessen Webseite oder Emailadresse. Wenn nun der Hersteller in seiner Firma im Lager Holz aus Neuguinea bekommt, so bekommt der Herstellers ein neues Attribut, über den Zettel in der Gitarre könntest Du nun auf dieses neue Attribut des herstellers zugreifen, aber die Gitarre selber ändert sich dadurch nicht.
Gruß
Dookie
hi dookie!
wenn man den ganzen tag sich mit einer sache beschäftigt, so wie ich heute mit new style klassen, dann gerät manchmal was durcheinander. ich werde versuchen das zu ordnen:
kennen wir nun schon:
jetzt schau das mal: instanzierung, namensraum von a:
nun ändere ich die klasse:
und nun noch einmal der namensraum von a:
a verweist nun auf ein objekt, das über new_site_vars verfügt:
fazit: sollte verhindern, dass die instanz a auf ein objekt verweist, dass mehr als die attribute verfügt. durch die änderung der klasse ist dies aber nicht mehr der fall.
und zudem meinte ich: wenn auch diese funktion hätte, dann sollte auch dafür gesorgt sein, dass man es nicht einfach so manipulieren kann.
ich hoffe, ich habe es jetzt von allen versuchen am besten formuliert.
mfg
rolgal
wenn man den ganzen tag sich mit einer sache beschäftigt, so wie ich heute mit new style klassen, dann gerät manchmal was durcheinander. ich werde versuchen das zu ordnen:
Code: Alles auswählen
#!/usr/local/bin/python
class Test(object):
__slots__=['site_vars']
base_vars={'a' : '1',
'b' : '2',
'c' : '3',
'd' : ''}
def __init__(self, **kw):
self.site_vars=self.base_vars.copy()
self.site_vars.update(kw)
def __str__(self):
site=str(self.site_vars.values())
return site
jetzt schau das mal: instanzierung, namensraum von a:
Code: Alles auswählen
>>> a=Test()
>>> print a
['1', '3', '2', '']
>>> dir(a)
['__class__', '__delattr__', '__doc__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__slots__', '__str__', 'base_vars', 'site_vars']
>>>
Code: Alles auswählen
>>> Test.new_site_vars={'new_a':'new_1','new_b':'new_2'}
Code: Alles auswählen
>>> dir(a)
['__class__', '__delattr__', '__doc__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__slots__', '__str__', 'base_vars', 'new_site_vars', 'site_vars']
Code: Alles auswählen
>>> print a.new_site_vars
{'new_b': 'new_2', 'new_a': 'new_1'}
>>>
Code: Alles auswählen
__slots__
Code: Alles auswählen
site_vars
und zudem meinte ich: wenn
Code: Alles auswählen
__slots__
ich hoffe, ich habe es jetzt von allen versuchen am besten formuliert.
mfg
rolgal
hi milan
grundsätzliches zu, siehe bitte antwort für dookie.
1. python war ursprgl. als skriptsprache für kleiner projekte gedacht (ich suche schon die ganze zeit nach dem zitat...) , d. h. man kann davon ausgehen, dass man in etwa dachte: 1 entwickler - kennt seinen quellcode, restrektive massnahmen sind nicht notwendig.
2. python ist auffallend offen konzipiert. ich kann mir in einem gespräch mit den entwicklern folgendes nur schwer vorstellen:
"nun ja, das gibts jetzt schon seit jahren, wir haben uns nichts dabei gedacht und irgendwie haben wir uns dann gedacht, wenn wir schon scheisse bauen, sollten wir konsequent bleiben und keine echten private attribute erlauben (wie echt sie sind ist mir auch noch nicht klar, da liest man viel verwirrendes) und dann haben wir mit noch eins draufgesetzt, das zwar die anzahl und die namen der attribute einer instanz schützen sollte, aber wenn du die klasse umänderst, dann kannst den unfug weiter betreiben"
naja, das war jetzt nur der versuch die problematik, die ich mit dem thema habe etwas humoristisch darzustellen.
es ist abslolut nicht als angriff auf die art und weise wie du oder dookie o.a. oop versteht und umsetzt zu verstehen.
ich schreibe das deshalb, weil geschriebenes leichter missverstanden werden kann, als gesprochenes.
mfg
grundsätzliches zu
Code: Alles auswählen
__slots__
ja, um die frage und deren beantwortung ging es mir ganz ursprünglich. wollten sie neue aspekte für oop ermöglichen oder ist es wirklich ein unfug der ihnen unterlaufen ist?. ganz ursprgl. wollte ich die diese möglichkeiten und ihre nützlichkeite im dialog ausloten.
Warum du nun also schreibenden Zugriff auf die Klassenattribute hast, musst du die Pythonentwickler fragen.
davon bin ich auch immer ausgegangen. denn angefangen hat ja alles mit einem modul von mir, dass versch. webseiten zur verfügung stellt, also diese dynamisch erstellt.Hier könntest du aber auch eine große Ausnahme machen, wenn du a) den Quellcode kennst
hm, ich will jetzt nicht losreden, weil ich nicht ganz sicher bin, ob wir dasselbe meinen. kannst du bitte konkretisieren?b) gerade diese Identität als nützliches Mittel erwünscht ist.
den verdacht habe ich eben auch, irgendwie.Man kann damit technische Kunstgriffe machen
darüber bin ich mir noch nicht im klaren.sollte es aber als Ausnahme behandeln und möglichst andere Wege gehen.
1. python war ursprgl. als skriptsprache für kleiner projekte gedacht (ich suche schon die ganze zeit nach dem zitat...) , d. h. man kann davon ausgehen, dass man in etwa dachte: 1 entwickler - kennt seinen quellcode, restrektive massnahmen sind nicht notwendig.
2. python ist auffallend offen konzipiert. ich kann mir in einem gespräch mit den entwicklern folgendes nur schwer vorstellen:
"nun ja, das gibts jetzt schon seit jahren, wir haben uns nichts dabei gedacht und irgendwie haben wir uns dann gedacht, wenn wir schon scheisse bauen, sollten wir konsequent bleiben und keine echten private attribute erlauben (wie echt sie sind ist mir auch noch nicht klar, da liest man viel verwirrendes) und dann haben wir mit
Code: Alles auswählen
__slots__
naja, das war jetzt nur der versuch die problematik, die ich mit dem thema habe etwas humoristisch darzustellen.
es ist abslolut nicht als angriff auf die art und weise wie du oder dookie o.a. oop versteht und umsetzt zu verstehen.
ich schreibe das deshalb, weil geschriebenes leichter missverstanden werden kann, als gesprochenes.
mfg
-
- Python-Forum Veteran
- Beiträge: 2010
- Registriert: Freitag 11. Oktober 2002, 18:00
- Wohnort: Salzburg
- Kontaktdaten:
Hi Rolgal,
mir ist vorhin in der Badewanne ein Beispiel speziell für Dich eingefallen:
Wenn Du Gitarre spielst, variierst Du die Töne ja auch nicht durch drehen an den Wirbeln sondern indem Du die Seiten auf das Griffbrett drückst.
Hat der Gitarrenbauer nun Misst gebaut weil er es erlaubt an den Wribeln die Tonhöhe der Seiten zu ändern?
Eigentlich nicht, sonst könntest Du die Gitarre ja nicht stimmen.
Gruß
Dookie
mir ist vorhin in der Badewanne ein Beispiel speziell für Dich eingefallen:
Wenn Du Gitarre spielst, variierst Du die Töne ja auch nicht durch drehen an den Wirbeln sondern indem Du die Seiten auf das Griffbrett drückst.
Hat der Gitarrenbauer nun Misst gebaut weil er es erlaubt an den Wribeln die Tonhöhe der Seiten zu ändern?
Eigentlich nicht, sonst könntest Du die Gitarre ja nicht stimmen.
Gruß
Dookie
hi dookie!
das beispiel ist geil!!!!
dennoch, in der modernen musik musst du mit allem gefasst sein. und wie du selbst sagtest: ich muss die gitarre ja stimmen. d.h. diese möglichkeit muss vorhanden sein.
die veränderung von klassen und objekten von aussen auch
ok, für heute verzieh ich mich....
gute nacht, schönen wochenbeginn.
hast du dir eigentlich die obigen bsp. angeguckt? das mitfinde ich echt interessant.
mfg
rolgal
das beispiel ist geil!!!!
dennoch, in der modernen musik musst du mit allem gefasst sein. und wie du selbst sagtest: ich muss die gitarre ja stimmen. d.h. diese möglichkeit muss vorhanden sein.
die veränderung von klassen und objekten von aussen auch
ok, für heute verzieh ich mich....
gute nacht, schönen wochenbeginn.
hast du dir eigentlich die obigen bsp. angeguckt? das mit
Code: Alles auswählen
dir(a)
mfg
rolgal
-
- Python-Forum Veteran
- Beiträge: 2010
- Registriert: Freitag 11. Oktober 2002, 18:00
- Wohnort: Salzburg
- Kontaktdaten:
Hi rolgal,
nimm das Beispiel nicht zu wörtlich.
dir zeigt alle im Namensraum zugreifbaren Objekte, steht auch so in der Doku pydoc dir
Dookie
nimm das Beispiel nicht zu wörtlich.
dir zeigt alle im Namensraum zugreifbaren Objekte, steht auch so in der Doku pydoc dir
Gruß...
Type or class object: its attributes, and recursively the attributes of
its bases.
Otherwise: its attributes, its class's attributes, and recursively the
attributes of its class's base classes.
Dookie
hi dookie!
was ausgibt wäre mir ja egal, würde sich nicht auch zeigen, dass a eben nach der änderung der klasse auf ein objekt verweist, dass attribute und werte hat, die es eigentlich auf grund von nicht haben sollte.
mfg
rolgal
was
Code: Alles auswählen
dir(a)
Code: Alles auswählen
__slots__
mfg
rolgal
ja klar, den namenraum von a
oder nicht?
sonst würde die übergabe von a ja keinen sinn machen, dass da mehr drin steht wie die attribute und methoden von a ist schon klar.
mich hat verwundert dass eben auch die geänderten klassenattribute drinnen stehen
mfg
rolgal
Code: Alles auswählen
dir(a)
sonst würde die übergabe von a ja keinen sinn machen, dass da mehr drin steht wie die attribute und methoden von a ist schon klar.
mich hat verwundert dass eben auch die geänderten klassenattribute drinnen stehen
mfg
rolgal
-
- Python-Forum Veteran
- Beiträge: 2010
- Registriert: Freitag 11. Oktober 2002, 18:00
- Wohnort: Salzburg
- Kontaktdaten:
Hi rolgal,
in der Doku ist gemeint, wenn das Objekt ein Type oder eine Klasse ist, werden dessen Attribute und rekursiv die Attribute der Basisklassen zurückgegeben, anderfalls (also wenn es sich um eine Instanz einer Klasse handelt) deren Attribute, deren Klassenattribute und rekursiv die Attribute der Basisklassen der Klasse der Instanz.
Gruß
Dookie
in der Doku ist gemeint, wenn das Objekt ein Type oder eine Klasse ist, werden dessen Attribute und rekursiv die Attribute der Basisklassen zurückgegeben, anderfalls (also wenn es sich um eine Instanz einer Klasse handelt) deren Attribute, deren Klassenattribute und rekursiv die Attribute der Basisklassen der Klasse der Instanz.
Gruß
Dookie