Словарь Python от полей объекта

В Java все находится в форме класса.

Если вы хотите использовать любой объект, тогда у вас есть две фазы:

  1. Объявить
  2. Инициализация

Пример:

  • Объявление: Object a;
  • Инициализация: a=new Object();

То же самое для концепции массива

  • Объявление: Item i[]=new Item[5];
  • Инициализация: i[0]=new Item();

Если вы не дают секцию инициализации, тогда возникает NullpointerException.

309
задан Acumenus 30 October 2016 в 13:54
поделиться

4 ответа

Обратите внимание, что лучшая практика в 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}

А лучше приближаются (предложенный [1 111] robert в комментариях), встроенное 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...
382
ответ дан maxkoryukov 23 November 2019 в 01:14
поделиться

dir встроенный даст Вам атрибуты всего объекта, включая специальные методы как __str__, __dict__ и целый набор других, которых Вы, вероятно, не хотите. Но можно сделать что-то как:

>>> class Foo(object):
...     bar = 'hello'
...     baz = 'world'
...
>>> f = Foo()
>>> [name for name in dir(f) if not name.startswith('__')]
[ 'bar', 'baz' ]
>>> dict((name, getattr(f, name)) for name in dir(f) if not name.startswith('__')) 
{ 'bar': 'hello', 'baz': 'world' }

Так может расширить это, чтобы только возвратить атрибуты данных и не методы, путем определения Вашего props функция как это:

import inspect

def props(obj):
    pr = {}
    for name in dir(obj):
        value = getattr(obj, name)
        if not name.startswith('__') and not inspect.ismethod(value):
            pr[name] = value
    return pr
56
ответ дан animuson 23 November 2019 в 01:14
поделиться

Я обосновался с комбинацией обоих ответов:

dict((key, value) for key, value in f.__dict__.iteritems() 
    if not callable(value) and not key.startswith('__'))
26
ответ дан Julio César 23 November 2019 в 01:14
поделиться

Для создавания словаря от произвольного объект достаточно использовать __dict__.

Это пропускает атрибуты, которые объект наследовал от своего класса. Например,

class c(object):
    x = 3
a = c()

hasattr (a, 'x') верен, но 'x' не появляется в a. __ dict __

15
ответ дан minopret 23 November 2019 в 01:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: