IC # мы делаем это через отражение. В Javascript это просто:
for(var propertyName in objectName)
var currentPropertyValue = objectName[propertyName];
Как это сделать на Python?
python
reflection
properties
Джадер Диас
источник
источник
@property
.Ответы:
Имейте в виду, что в некоторых редких случаях есть
__slots__
свойство, у таких классов часто нет__dict__
.источник
__setattr__()
. Установка значений непосредственно в словаре обходит установщик объекта (и / или его родителей). В python довольно часто случается, что в фоновом режиме во время установки атрибутов происходит больше вещей, чем кажется на первый взгляд (например, санитария), использованиеsetattr()
гарантирует, что вы не пропустите или будете вынуждены обрабатывать их явно самостоятельно.vars()
возвращает только статические члены (т. е. атрибуты объекта и методы, зарегистрированные с этим объектом__dict__
). Он не возвращает динамические члены (т. Е. Атрибуты объекта и методы, динамически определяемые методом этого объекта__getattr__()
или подобной магией). По всей вероятности, нужнаяfile.ImplementationName
свойство определяется динамически и , следовательно , не доступныvars()
илиdir()
.Смотрите
inspect.getmembers(object[, predicate])
.источник
attributes
вместоmembers
(есть ли разница между ними?). Они могли бы исправить имя в Python 3.0, чтобы оно было согласованным.__dict__
, извини.inspect.getmembers()
обертываниеdir()
с незначительными ( в основном) побочными выгодами от (А) , включая атрибуты динамического класса и атрибуты метакласса и (B) за исключение членов , не совпадающих переданный предикат. Зевая, правда?inspect.getmembers()
подходит для сторонних библиотек, в целом поддерживающих все возможные типы объектов. Однако для стандартных случаев использования этогоdir()
вполне достаточно.dir()
это простой способ. Посмотреть здесь:Руководство по самоанализу Python
источник
dir()
спасибо.__dict__
Свойство объекта представляет собой словарь всех других его определенных свойств. Обратите внимание, что классы Python могут переопределять getattr и делать вещи, которые выглядят как свойства, но не входят в__dict__
. Там также функции BUILTINvars()
иdir()
которые отличаются тонкими способами. И__slots__
может заменить__dict__
в каких-то необычных классах.Объекты в Python сложны.
__dict__
это подходящее место для начала программирования в стиле рефлексии.dir()
это место, с которого можно начать, если вы работаете в интерактивной оболочке.источник
print vars.__doc__
указывает на это.With an argument, equivalent to object.__dict__
Итак, в чем заключаются тонкие различия?Георг Шолли, укороченная версия
источник
Если вы ищете отражение всех свойств, ответы выше отлично подходят.
Если вы просто хотите получить ключи словаря (который отличается от «объекта» в Python), используйте
my_dict.keys()
источник
obj['key']
vs.obj.property
), и вопрос был о свойствах объекта. Я поставил здесь свой ответ, потому что их легко перепутать.Это полностью покрыто другими ответами, но я сделаю это явным. Объект может иметь атрибуты класса, статические и динамические атрибуты экземпляра.
stasis
статичен,dyno
динамичен (см. декоратор свойств) иclassy
является атрибутом класса. Если мы просто сделаем__dict__
илиvars
получим только статический.Так что, если мы захотим, другие
__dict__
получат все (и даже больше). Сюда входят магические методы и атрибуты, а также обычные связанные методы. Так что давайте избегать:type
Вызывается метод собственности оформлен (динамический атрибут) даст вам тип возвращаемого значения, а неmethod
. Чтобы доказать это, давайте сделаем это с помощью json:Если бы это был метод, он бы рухнул.
TL; DR. попробуйте вызвать
extravar = lambda o: {k: getattr(o, k, '') for k in o.__dir__() if k[:2] != '__' and type(getattr(o, k, '')).__name__ != 'method'}
все три, но не методы и не магию.источник