Python: Zugriffsklasseneigenschaft aus String

Ich habe eine Klasse wie die folgenden:

class User: def __init__(self): self.data = [] self.other_data = [] def doSomething(self, source): // if source = 'other_data' how to access self.other_data 

Ich möchte einen String für die Quellvariable in doSomething und auf das gleichnamige Klassenmitglied zugreifen.

Ich habe versucht getattr die nur funktioniert auf Funktionen (von dem, was ich sagen kann) sowie mit User erweitern dict und mit self.__getitem__ , aber das funktioniert auch nicht. Was ist der beste Weg, dies zu tun?

4 Solutions collect form web for “Python: Zugriffsklasseneigenschaft aus String”

x = getattr(self, source) funktioniert einfach perfekt, wenn other_data ANY Attribut von Selbst, die other_data in deinem Beispiel enthalten.

Ein Bild sagt tausend Worte:

 >>> class c: pass o = c() >>> setattr(o, "foo", "bar") >>> o.foo 'bar' >>> getattr(o, "foo") 'bar' 

Verlängert Alex Antwort leicht:

 class User: def __init__(self): self.data = [1,2,3] self.other_data = [4,5,6] def doSomething(self, source): dataSource = getattr(self,source) return dataSource A = User() print A.doSomething("data") print A.doSomething("other_data") 

Wird ergeben:

 [1, 2, 3]
 [4, 5, 6]

Allerdings persönlich denke ich nicht, dass das große Stil ist – getattr lässt Sie auf jedes Attribut der Instanz zugreifen, einschließlich Sachen wie die doSomething Methode selbst oder sogar die __dict__ der Instanz. Ich würde vorschlagen, dass Sie stattdessen ein Wörterbuch von Datenquellen implementieren, so wie:

 class User: def __init__(self): self.data_sources = { "data": [1,2,3], "other_data":[4,5,6], } def doSomething(self, source): dataSource = self.data_sources[source] return dataSource A = User() print A.doSomething("data") print A.doSomething("other_data") 

Wieder nachgeben:

 [1, 2, 3]
 [4, 5, 6]

  • getattr(x, 'y') entspricht xy
  • setattr(x, 'y', v) entspricht xy = v
  • delattr(x, 'y') ist gleichbedeutend mit del xy
  • Hat Python ein Äquivalent zu 'switch'?
  • Was macht das "at" (@) Symbol in Python?
  • In Python 2, was ist der Unterschied zwischen '/' und '//', wenn für die Teilung verwendet?
  • Syntaxfehler beim Folgen von Pygame / Python Tutorial auf YouTube
  • Was ist :: (Doppelkolon) in Python bei der Abrechnung von Sequenzen?
  • Reversierliste mit Slice Notation
  • Was ist python .. ("dot dot") Notationssyntax?
  • Was bedeutet ** (Doppelstern) und * (Stern) für Parameter?
  • Was bedeutet?
  • Was macht der ** Mathe-Operator in Python?
  • Generator als Funktionsargument
  • Python ist die beste Programmiersprache der Welt.