2017-02-19 6 views
1

So habe ich eine Klasse wie folgt:Pass Attributname der Klasse, die als Parameter in der Funktion

class var: 
    def __init__(self, x, y, z): 
     self.x = x 
     self.y = y 
     self.z = z 

object = var(1, 2, 3) 

Und ich möchte eine Funktion machen, die den Namen eines der Attribute meiner Klasse als Parameter übernimmt, so etwas wie dieses (Beispiel) zu machen:

def function(object, a): 
    object.a = 5 

Natürlich kann ich 'a' als String übergeben und einige, wenn Fälle machen:

def function(object, a): 

    if (a == 'x'): 
     object.x = 5 

    if (a == 'y'): 
     object.y = 5 

    if (a == 'z'): 
     object.z = 5 

Aber in diesem Fall müsste ich den gesamten Code innerhalb der ifs kopieren (offensichtlich möchte ich mehr tun als nur einen Wert zuweisen). Ich würde gerne wissen, ob es einen cleveren Weg gibt, das zu tun.

edit:

Um zu klären, hat mein Objekt mehr Variablen:

class var: 
    def __init__(self, x, y, z, a, b, c): 
     self.x = x 
     self.y = y 
     self.z = z 
     self.a = a 
     self.b = b 
     self.c = c 

Und ich werde diese in meinen Funktionen zugreifen. Deshalb gebe ich nicht einfach object.x oder object.y weiter. Ich werde das Objekt und die Variable übergeben, die ich verwenden werde, aber es gibt noch andere Variablen, auf die ich zugreifen werde.

+0

Gibt es einen Grund, warum Sie 'object.a' nicht einfach als einzelnen Parameter übergeben, anstatt' object' und 'a' als zwei separate Parameter? –

+0

@BryanOakley das OP möchte den Wert von * any * Attribut des Objekts, die * ich denke * wird nicht durch die Übergabe in 'object.a' –

+0

@ Snađошƒаӽ: Nun, Sie können alle gewünschten Attribut übergeben: 'function (object.a)', 'function (object.b)' usw. Was immer Sie übergeben, wird festgelegt. –

Antwort

2

Möglicherweise möchten Sie verwenden setattr:

def set(object, name): 
    setattr(object, name, 5) 
+1

Dadurch können unerwünschte neue Variablen für das Objekt erstellt werden. z.B. set (object, 'm') weist dem Objekt eine neue Variable zu, z. B. object.m – Afaq

+0

Sie können prüfen, ob vor dem Aufruf von setattr für das Objekt ein Häkchen 'if name in object .__ dict __:' hinzugefügt wird. – Afaq

+1

@Afaq oder Sie können auch 'hasattr()' Methode verwenden. –

1

erweitern, was Daniel in seiner Antwort zeigte, können Sie zunächst überprüfen, ob das Objekt das Attribut hat oder nicht durch hasattr() verwenden, und legen Sie den Wert des Attributs unter Verwendung von setattr().

def function(object, a): 
    if name in object.__dict__: 
     setattr(object, a, 5) 

Hinweis: Nehmen Sie einen Blick auf diesen comment, die die richtige Art und Weise gezeigt, um zu bestimmen, ob ein Objekt ein Attribut hat. Was ich meine ist __dict__ enthält keine Methodennamen.

+0

Danke, das wollte ich. –

Verwandte Themen