Как динамически получить доступ к свойствам класса в Python? - PullRequest
25 голосов
/ 11 марта 2010

Допустим, я создаю экземпляр класса и хочу присвоить некоторые значения его общедоступным свойствам. Обычно это делается так:

class MyClass:
    def __init__(self):
        self.name = None
        self.text = None

myclass = MyClass()
myclass.name = 'My name'

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

Очевидным будет:

myclass = MyClass()
myclass['name'] = "My name"

Но это не работает.

Есть идеи?

Ответы [ 3 ]

36 голосов
/ 11 марта 2010
setattr(my_class_instance, 'attr_name', attr_value)
8 голосов
/ 08 марта 2015

После прочтения отклонено Синтаксис для динамического доступа к атрибутам Я использую класс mixin, обеспечивающий доступ в стиле словаря к атрибутам объекта:

class MyClass:
    def __init__(self):
        self.name = None
        self.text = None
    def __getitem__(self, name):
        return getattr(self, name)
    def __setitem__(self, name, value):
        return setattr(self, name, value)
    def __delitem__(self, name):
        return delattr(self, name)
    def __contains__(self, name):
        return hasattr(self, name)

При возможности устанавливать атрибуты напрямую:

myclass = MyClass()
myclass.name = "foo"
myclass.text = "bar"

тогда можно установить их динамически:

for attr in ('name', 'text'):
    myclass[attr] = confirm(attr, default=myclass[attr])
0 голосов
/ 11 марта 2010

Использование dir с setattr должно сделать работу

class MyClass:
  def __init__(self):
    self.name = None
    self.text = None

myclass = MyClass()
myclass.name = 'My name'

for prop in dir(myclass):
    print '%s:%s'%(prop,getattr(myclass,prop))

print

for prop in dir(myclass):
    if prop[:2]!='__' and prop[-2:]!='__':
        print prop[-2:]
        setattr(myclass,prop,"Foo Bar")

for prop in dir(myclass):
    print '%s:%s'%(prop,getattr(myclass,prop))    

Но будьте осторожны, потому что этот код также устанавливает свойства '__doc__', '__init__', '__module__' в "Foo Bar". Поэтому вам придется позаботиться о том, чтобы избежать определенных вещей, которые вам дают dir (особенно те, которые начинаются и заканчиваются __ двойным подчеркиванием).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...