IC # мы делаем это через отражение. В Javascript это просто:
for(var propertyName in objectName)
var currentPropertyValue = objectName[propertyName];
Как это сделать на Python?
@property
.
IC # мы делаем это через отражение. В Javascript это просто:
for(var propertyName in objectName)
var currentPropertyValue = objectName[propertyName];
Как это сделать на Python?
@property
.
Ответы:
for property, value in vars(theObject).iteritems():
print property, ": ", value
Имейте в виду, что в некоторых редких случаях есть __slots__
свойство, у таких классов часто нет __dict__
.
__setattr__()
. Установка значений непосредственно в словаре обходит установщик объекта (и / или его родителей). В python довольно часто случается, что в фоновом режиме во время установки атрибутов происходит больше вещей, чем кажется на первый взгляд (например, санитария), использование setattr()
гарантирует, что вы не пропустите или будете вынуждены обрабатывать их явно самостоятельно.
vars()
возвращает только статические члены (т. е. атрибуты объекта и методы, зарегистрированные с этим объектом __dict__
). Он не возвращает динамические члены (т. Е. Атрибуты объекта и методы, динамически определяемые методом этого объекта __getattr__()
или подобной магией). По всей вероятности, нужная file.ImplementationName
свойство определяется динамически и , следовательно , не доступны vars()
или dir()
.
Смотрите inspect.getmembers(object[, predicate])
.
Возвращает все члены объекта в списке пар (имя, значение), отсортированных по имени. Если предоставляется необязательный аргумент предиката, включаются только члены, для которых предикат возвращает истинное значение.
>>> [name for name,thing in inspect.getmembers([])]
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__',
'__delslice__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__',
'__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__',
'__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__','__reduce_ex__',
'__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__',
'__sizeof__', '__str__', '__subclasshook__', 'append', 'count', 'extend', 'index',
'insert', 'pop', 'remove', 'reverse', 'sort']
>>>
attributes
вместо members
(есть ли разница между ними?). Они могли бы исправить имя в Python 3.0, чтобы оно было согласованным.
__dict__
, извини.
inspect.getmembers()
обертывание dir()
с незначительными ( в основном) побочными выгодами от (А) , включая атрибуты динамического класса и атрибуты метакласса и (B) за исключение членов , не совпадающих переданный предикат. Зевая, правда? inspect.getmembers()
подходит для сторонних библиотек, в целом поддерживающих все возможные типы объектов. Однако для стандартных случаев использования этого dir()
вполне достаточно.
dir()
это простой способ. Посмотреть здесь:
dir()
спасибо.
__dict__
Свойство объекта представляет собой словарь всех других его определенных свойств. Обратите внимание, что классы Python могут переопределять getattr
и делать вещи, которые выглядят как свойства, но не входят в __dict__
. Там также функции BUILTIN vars()
и dir()
которые отличаются тонкими способами. И __slots__
может заменить __dict__
в каких-то необычных классах.
Объекты в Python сложны. __dict__
это подходящее место для начала программирования в стиле рефлексии. dir()
это место, с которого можно начать, если вы работаете в интерактивной оболочке.
print vars.__doc__
указывает на это. With an argument, equivalent to object.__dict__
Итак, в чем заключаются тонкие различия?
Георг Шолли, укороченная версия
print vars(theObject)
Если вы ищете отражение всех свойств, ответы выше отлично подходят.
Если вы просто хотите получить ключи словаря (который отличается от «объекта» в Python), используйте
my_dict.keys()
my_dict = {'abc': {}, 'def': 12, 'ghi': 'string' }
my_dict.keys()
> ['abc', 'def', 'ghi']
obj['key']
vs. obj.property
), и вопрос был о свойствах объекта. Я поставил здесь свой ответ, потому что их легко перепутать.
Это полностью покрыто другими ответами, но я сделаю это явным. Объект может иметь атрибуты класса, статические и динамические атрибуты экземпляра.
class foo:
classy = 1
@property
def dyno(self):
return 1
def __init__(self):
self.stasis = 2
def fx(self):
return 3
stasis
статичен, dyno
динамичен (см. декоратор свойств) и classy
является атрибутом класса. Если мы просто сделаем __dict__
или vars
получим только статический.
o = foo()
print(o.__dict__) #{'stasis': 2}
print(vars(o)) #{'stasis': 2}
Так что, если мы захотим, другие __dict__
получат все (и даже больше). Сюда входят магические методы и атрибуты, а также обычные связанные методы. Так что давайте избегать:
d = {k: getattr(o, k, '') for k in o.__dir__() if k[:2] != '__' and type(getattr(o, k, '')).__name__ != 'method'}
print(d) #{'stasis': 2, 'classy': 1, 'dyno': 1}
type
Вызывается метод собственности оформлен (динамический атрибут) даст вам тип возвращаемого значения, а не method
. Чтобы доказать это, давайте сделаем это с помощью json:
import json
print(json.dumps(d)) #{"stasis": 2, "classy": 1, "dyno": 1}
Если бы это был метод, он бы рухнул.
TL; DR. попробуйте вызвать extravar = lambda o: {k: getattr(o, k, '') for k in o.__dir__() if k[:2] != '__' and type(getattr(o, k, '')).__name__ != 'method'}
все три, но не методы и не магию.