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
  • Wie bekomme ich einen Dezimalwert bei der Verwendung des Divisionsoperators in Python?
  • Mittlerer Kommentar in Python?
  • Was bedeutet `**` in dem Ausdruck `dict (d1, ** d2) '?
  • Übergeben von Python-Slice-Syntax um Funktionen
  • Syntaxfehler beim Versuch, Argumente zu parsen Python-Shell
  • E484: Die Datei C: \ Users \ Me \ Desktop \ syntax \ syntax.vim kann nicht mit vundle geöffnet werden
  • Warum verursacht diese if-Anweisung einen Syntaxfehler
  • Python Wenn dann Else Stil, wenn man Werte aus Dicts
  • Hat Python ein Äquivalent zu 'switch'?
  • Wie lösche ich Artikel aus einem ttk.Treeview-Widget?
  • Wann sind Klammern um ein Tupel erforderlich?
  • Python ist die beste Programmiersprache der Welt.