2017-02-19 2 views
1

Так у меня есть класс вроде этого:Pass имя атрибута класса в качестве параметра в функции

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

object = var(1, 2, 3) 

И я хочу сделать функцию, которая принимает в качестве параметра имя одного из атрибутов моего класса, чтобы сделать что-то вроде этого (например):

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

Очевидно, что я могу передать «а» в виде строки и сделать некоторые, если случаи:

def function(object, a): 

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

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

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

Но в этом случае мне пришлось бы скопировать весь код внутри if (очевидно, я хочу сделать больше, чем просто присвоить значение). Я хотел бы знать, есть ли способ сделать это.

редактировать:

Чтобы уточнить, мой объект имеет несколько переменных:

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 

И я к ним доступ в мои функции. Вот почему я не передаю просто object.x или object.y. Я передам объект и переменную, которую я буду использовать, но есть и другие переменные, к которым я буду обращаться.

+0

Есть ли причина, по которой вы просто не передаете 'object.a' как один параметр, а не' object' и 'a' как два отдельных параметра? –

+0

@BryanOakley OP хочет установить значение * любого * атрибута объекта, который * я думаю * не будет достигнут, перейдя в 'object.a' –

+0

@ Sнаđошƒаӽ: ну, вы можете передать любой атрибут, который вы хотите: 'function (object.a)', 'function (object.b)' и т. д. Что бы вы ни проходили, это то, что устанавливается. –

ответ

2

Вы можете использовать setattr:

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

Это может создать нежелательные новые переменные для объекта. например set (object, 'm') присваивает новую переменную объекту i.e. object.m – Afaq

+0

Вы можете рассмотреть возможность добавления проверки 'if name в object .__ dict __:' перед вызовом setattr на объекте. – Afaq

+1

@Afaq или вы также можете использовать метод 'hasattr()'. –

1

Продление, что Даниил показал в своем ответе, вы можете сначала проверить, если объект имеет атрибут или нет с помощью hasattr(), а затем установите значение атрибута используя setattr().

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

Примечание: посмотрите на эту comment, который показал правильный способ определить, если объект имеет атрибут. Я имею в виду, что __dict__ не включает имена методов.

+0

Спасибо, это то, что я хотел. –

Смежные вопросы