Liste mit allen __<irgendwas>__

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
ChrisGTJ
User
Beiträge: 105
Registriert: Mittwoch 22. August 2007, 15:45

Freitag 16. Januar 2009, 19:06

Hallo Leute,

mal wieder so eine billige Frage (wo sich die Doku weigert, mir Auskunft zu geben :evil:): Ich weiß, daß es gott-segen-und-sack voll Attribute wie __class__ oder __bases__ gibt. Gibt es irgendwo eine Liste mit diesen Teilen und deren Bedeutungen?

Danke,

Christoph

PS: Wie überrede ich die SuFu, auch nach unterstrichen zu suchen? Ich wollte nach "__class__" suchen und nicht nach "class". Bin ich eigentlich der einizige, der keine Ahnung hat? :shock: Ich hasse es...
Costi
User
Beiträge: 544
Registriert: Donnerstag 17. August 2006, 14:21

Freitag 16. Januar 2009, 19:36

also ich finde massig ergenisse (google) hier ein beispiel
http://docs.python.org/reference/datamo ... thod-names
cp != mv
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Freitag 16. Januar 2009, 19:37

Guckst du hier: http://docs.python.org/reference/datamo ... ecialnames

Stichworte sind "magic names" oder "special names" ...
ChrisGTJ
User
Beiträge: 105
Registriert: Mittwoch 22. August 2007, 15:45

Montag 19. Januar 2009, 15:07

Danke für die Antworten, ich hatte auf eine Liste gehofft...

Hintergrund meiner Frage ist die Überlegung, wie ein locking-Mechanismus funktionieren könnte (ja, ich weiß, daß es lock-objects gibt und daß mein Vorschlag auch nicht threadsicher ist):

Code: Alles auswählen

class A(object):
  def __init__(self):
    self.owner = None
  
  def acq( self, caller):
    if self.owner == None:
      self.owner = caller
  
  def rel( self, caller):
    if self.owner == caller:
      self.owner = None
  
  def func( self, caller):
    if self.owner == caller:
      print "Hallo!"
    else:
      print "kein Zugriff"
So weit, so simpel, jetzt muß nur der Nutzer dieses Objektes immer noch einen Parameter angeben. Wie ich Python einschätze, kann man ganz geschickt rausfinden, wer die Methoden acq(), rel() und func() aufgerufen hat.

Da ich aber nicht genau weiß, wie das heißt, dachte ich, es wäre schlau, mal die Liste der __<var>__ durchzugehen und eventuell das zu finden, was ich suche (allerdings ist das Vorhandensein der internen Variablen ja vom Objekt, dem die Variablen gehören, abhängig, daher ist eine vollständige Liste wohl etwas schwierig zu bauen). Ich habe etwas mit dir() rumgespielt, aber keine brauchbare Variable gefunden.

Gibt es für sowas eine pythonische Vorgehensweise?

Gruß,

Christoph
DasIch
User
Beiträge: 2465
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Montag 19. Januar 2009, 15:45

ChrisGTJ hat geschrieben:Wie ich Python einschätze, kann man ganz geschickt rausfinden, wer die Methoden acq(), rel() und func() aufgerufen hat.
Falsch geschätzt.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 19. Januar 2009, 17:04

DasIch hat geschrieben:
ChrisGTJ hat geschrieben:Wie ich Python einschätze, kann man ganz geschickt rausfinden, wer die Methoden acq(), rel() und func() aufgerufen hat.
Falsch geschätzt.
Kann man durchaus herausfinden, ohne sonderliche Verrenkungen. Aber man würde sowas nicht machen, da es nicht pythonisch ist (Explicit is better than implicit).
BlackJack

Dienstag 20. Januar 2009, 08:46

Insbesondere kann da auch etwas heraus kommen mit dem man nicht gerechnet hat, wenn irgend wo Wrapperklassen / Delegation im Spiel sind, oder die Methoden aus einer Funktion heraus aufgerufen werden.
ChrisGTJ
User
Beiträge: 105
Registriert: Mittwoch 22. August 2007, 15:45

Dienstag 20. Januar 2009, 10:48

Hallo,

ok, verstehe, also das Konzept, den Caller oder wenigstens eine ID mit zu übergeben, wäre das pythonische Vorgehen. An der Ecke unterscheidet sich pythonisch nicht von anderen Sprachen.

Nur so aus Neugier (sonst würd ich das ja auch gar nicht versuchen, weil es das schon gibt): Wie wäre denn der einfache Weg?

Gruß,

Christoph
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Dienstag 20. Januar 2009, 17:45

Ich kenne nur einen Weg, der CPython-spezifisch ist und ausnutzt, das man auf die Frame-Objekte des Interpreters zugreifen kann. Aus sys kann sich die Funktion _getframe importieren und benutzen, um einen Frame zu bekommen, der ein Code-Objekt enthält, das einen Namen hat, was entweder der Name des aktuellen Moduls oder der entsprechenden Funktion ist.

Stefan
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 20. Januar 2009, 18:58

Alternativ kann man sich mit ``inspect.currentframe()`` das aktuelle Frame holen, von dort auf das vorherige Frame über ``f_back`` zugreifen, sich aus dem das Code-Objekt ``f_code`` holen und in dem den Namen über ``co_name`` herausholen. Kommt aufs gleiche hinaus wie das was sma macht.

Aber wie gesagt, pythonisch ist das nicht und wohl auch ziemlich implementationsspezifisch.
ChrisGTJ
User
Beiträge: 105
Registriert: Mittwoch 22. August 2007, 15:45

Mittwoch 21. Januar 2009, 13:16

Ok, danke, das wäre tatsächlich nicht sehr schlau programmiert.

Danke noch mal,

Christoph
Antworten