2014-01-08 3 views
1

У меня есть список настроек по умолчанию, сохраненных в моей функции init. Эти значения по умолчанию - это все переменные экземпляра. Например,Как просмотреть переменные экземпляра класса

self.set_acqmode = 1 
self.set_readmode = 4 
self.set_triggermode = 0 

У меня есть функция внутри этого класса, который я хочу использовать, чтобы изменить эти настройки по умолчанию, только передавая имя и значение в качестве аргументов. Например,

def change_setting(self, setting, *arg): 

Что было бы pythonic способом доступа и изменения правильной переменной экземпляра. Я попытался использовать как vars(), так и dict, чтобы просмотреть эти переменные, но первый только показал функции классов, а последний должен ссылаться на экземпляр класса (который еще не существует, поскольку он находится внутри класс).

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

+0

Ответьте на вторую часть моего собственного вопроса. Я узнал, прочитав ответы, что я могу использовать себя как ссылку на объект. Итак, self .__ dict__ показывает все переменные экземпляра. – Marmstrong

ответ

1

setattr будет работать. Но вы должны спросить: если вы переживаете всю эту проблему, чтобы переписать setattr, вы даже делаете это правильно?

Если вы просто хотите иметь какие-то произвольные ключи & значения - ну, это словарь, и вы должны использовать его как таковой. переопределить __getitem__/__setitem__, если вам нужно индивидуальное поведение.

если вам действительно нужны атрибуты, то нет никаких причин, материнская функция не будет просто сделать

myobj.set_triggermode = value 

, а не слишком сложной

myobj.change_setting('triggermode', value) 

так что вы должны сделать это. и даже если вы хотите сделать это по какой-то причине - используйте kwargs вместо args, возможно, ближе к тому, что вы хотите.

+0

Я действительно думал о создании родительской функции для каждой настройки, но есть много настроек. Таким образом, у меня может быть только одна функция, и она меняет переменные по мере необходимости. Некоторые из этих настроек не будут меняться часто, но мне все же нужно иметь способ изменения, если нужно. Целая функция потребует возраста. – Marmstrong

+0

Нет ... вам не нужна функция. Если у объекта есть атрибут 'x', вы можете его изменить, просто выполнив' obj.x = value'.Вам не нужно писать геттеры/сеттеры, атрибуты всегда общедоступны в python. –

+0

Вы абсолютно правы. Есть я над мыслями ... снова. Ваше решение прямолинейно. Я узнал больше, хотя <- я пытаюсь оправдать свою глупость. – Marmstrong

4

Использование setattr:

def change_setting(self, setting, *arg): 
    setattr(self, setting, arg) 
1

Вы, конечно, можете использовать __dict__:

>>> class Test(object): 
    def __init__(self): 
     self.x = 1 
    def set(self, attr, val): 
     self.__dict__[attr] = val 

>>> a = Test() 
>>> a.set('x', 2) 
>>> a.x 
2 
0

Вы можете использовать __dict__ на имя класса без того, экземпляр объекта этого класса. Например:

print myClass.__dict__.keys() 

:: редактировать :: Конечно, если вы быть строгим в программировании, вы можете рассмотреть возможность использования __slots__, в этом случае у вас будет все переменные экземпляра вашего класса предопределены самостоятельно ,

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