Seite 1 von 1

Liste mit allen __<irgendwas>__

Verfasst: Freitag 16. Januar 2009, 19:06
von ChrisGTJ
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...

Verfasst: Freitag 16. Januar 2009, 19:36
von Costi
also ich finde massig ergenisse (google) hier ein beispiel
http://docs.python.org/reference/datamo ... thod-names

Verfasst: Freitag 16. Januar 2009, 19:37
von numerix
Guckst du hier: http://docs.python.org/reference/datamo ... ecialnames

Stichworte sind "magic names" oder "special names" ...

Verfasst: Montag 19. Januar 2009, 15:07
von ChrisGTJ
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

Verfasst: Montag 19. Januar 2009, 15:45
von DasIch
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.

Verfasst: Montag 19. Januar 2009, 17:04
von Leonidas
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).

Verfasst: Dienstag 20. Januar 2009, 08:46
von BlackJack
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.

Verfasst: Dienstag 20. Januar 2009, 10:48
von ChrisGTJ
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

Verfasst: Dienstag 20. Januar 2009, 17:45
von sma
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

Verfasst: Dienstag 20. Januar 2009, 18:58
von Leonidas
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.

Verfasst: Mittwoch 21. Januar 2009, 13:16
von ChrisGTJ
Ok, danke, das wäre tatsächlich nicht sehr schlau programmiert.

Danke noch mal,

Christoph