Обратите внимание, что в Python 2.7 рекомендуется использовать классы нового стиля (не требуется в Python 3), т.е.
class Foo(object):
...
Кроме того, есть разница между «объектом» и «классом». Чтобы построить словарь из произвольного объекта , достаточно использовать __dict__
. Обычно вы объявляете свои методы на уровне класса и свои атрибуты на уровне экземпляра, поэтому все __dict__
должно быть в порядке. Например:
>>> class A(object):
... def __init__(self):
... self.b = 1
... self.c = 2
... def do_nothing(self):
... pass
...
>>> a = A()
>>> a.__dict__
{'c': 2, 'b': 1}
Лучшим подходом (предложенным Робертом в комментариях) является встроенная vars
функция:
>>> vars(a)
{'c': 2, 'b': 1}
Кроме того, в зависимости от того, что вы хотите сделать, было бы неплохо унаследовать от dict
. Тогда ваш класс уже словарь, и если вы хотите, вы можете переопределить getattr
и / или setattr
позвонить и установить dict. Например:
class Foo(dict):
def __init__(self):
pass
def __getattr__(self, attr):
return self[attr]
# etc...
__dict__
не будет работать, если объект использует слоты (или определен в модуле C).vars(a)
ли это делать? Для меня предпочтительнее вызывать__dict__
напрямую.__getattr__ = dict.__getitem__
точную копию поведения, тогда вы также захотите__setattr__ = dict.__setitem__
и__delattr__ = dict.__delitem__
для полноты.Вместо
x.__dict__
этого на самом деле это более питоническийvars(x)
.источник
MyClass(**my_dict)
, предполагая, что вы определили конструктор с параметрами, которые отражают атрибуты класса. Нет необходимости обращаться к закрытым атрибутам или переопределять dict.vars
функцию и ввести дополнительные функциональные возможности без изменения самого объекта.__slots__
все же.vars
, то есть для возврата эквивалента__dict__
для «прорезанных» классов. На данный момент его можно эмулировать, добавив__dict__
возвращаемое свойство{x: getattr(self, x) for x in self.__slots__}
(хотя и не уверен, что это как-то влияет на производительность или поведение).dir
Встроенный дадут вам все атрибуты объекта, включая специальные методы , такие как__str__
,__dict__
и целый букет других , которые вы , вероятно , не хотите. Но вы можете сделать что-то вроде:Таким образом, можно расширить это, чтобы возвращать только атрибуты данных, а не методы, определяя
props
функцию следующим образом:источник
ismethod
не ловит функции. Пример:inspect.ismethod(str.upper)
.inspect.isfunction
не намного полезнее, хотя. Не уверен, как подойти к этому сразу.Я согласился с комбинацией обоих ответов:
источник
staticmethod
? Это не такcallable
.Я подумал, что найду время, чтобы показать вам, как вы можете перевести объект на диктовку
dict(obj)
.Ключевым разделом этого кода является
__iter__
функция.Как поясняется в комментариях, первое, что мы делаем, это возьмем элементы класса и предотвратим все, что начинается с «__».
Как только вы это создали
dict
, вы можете использоватьupdate
функцию dict и передать экземпляр__dict__
.Это даст вам полный класс + экземпляр словаря членов. Теперь все, что осталось, - это перебрать их и получить результаты.
Кроме того, если вы планируете использовать это много, вы можете создать
@iterable
декоратор класса.источник
dict((x, y) for x, y in KpiRow.__dict__.items() if x[:2] != '__' and not callable(y))
это решит? Но все еще могут бытьstatic
методы :(Это пропускает атрибуты, которые объект наследует от своего класса. Например,
hasattr (a, 'x') имеет значение true, но «x» не появляется в .__ dict__
источник
vars()
как не работаетdir
- решение в этом случае. Смотрите другой ответ об этом.Поздний ответ, но с учетом полноты и пользы гуглеров:
Здесь не будут отображаться методы, определенные в классе, но все равно будут отображаться поля, в том числе те, которые назначены лямбдам, или те, которые начинаются с двойного подчеркивания.
источник
Я думаю, что самый простой способ - создать атрибут getitem для класса. Если вам нужно записать объект, вы можете создать собственный setattr . Вот пример для getitem :
dict генерирует атрибуты объектов в словарь, и объект словаря можно использовать для получения необходимого вам элемента.
источник
Недостаток использования
__dict__
является то, что он мелкий; он не будет преобразовывать подклассы в словари.Если вы используете Python3.5 или выше, вы можете использовать
jsons
:источник
Если вы хотите перечислить часть своих атрибутов, переопределите
__dict__
:Это очень помогает, если вы
instance
получаете большие данные блока и хотите отправитьd
в Redis очередь сообщений.источник
__dict__
является атрибутом, а не методом, поэтому этот пример изменяет интерфейс (т. е. его нужно вызывать как вызываемый), поэтому он не переопределяет его.ПИТОН 3:
Теперь вы можете использовать приведенный выше код внутри вашего собственного класса:
источник
vars()
отлично, но не работает для вложенных объектов объектовПреобразовать вложенный объект из объектов в dict:
источник