Есть ли в Python встроенный метод для получения массива всех переменных экземпляра класса? Например, если у меня есть этот код:
class hi:
def __init__(self):
self.ii = "foo"
self.kk = "bar"
Есть ли у меня способ сделать это:
>>> mystery_method(hi)
["ii", "kk"]
Изменить: изначально я ошибочно запрашивал переменные класса.
python
methods
instance-variables
Крис Банч
источник
источник
Ответы:
У каждого объекта есть
__dict__
переменная, содержащая все переменные и ее значения.Попробуй это
источник
Используйте vars ()
источник
__method
частный,__method__
это особый метод, не обязательно частный; Я хотел бы сказать, что специальные методы определяют возможности объекта, а не методы.__method__
довольно некрасиво, и я думаю, что они были названы так, чтобы попытаться удержать людей от их использования без крайней необходимости. В этом случае у нас есть альтернатива vars ().__str__
,__method__
являются для самого языка нормально. Что происходит, когда тыstr(something)
?Обычно вы не можете получить атрибуты экземпляра, заданные только классом, по крайней мере, без создания экземпляра класса. Однако вы можете получить атрибуты экземпляра для данного экземпляра или атрибуты класса для класса. См. Модуль «инспектировать». Вы не можете получить список атрибутов экземпляра, потому что экземпляры действительно могут иметь что угодно в качестве атрибута, и - как в вашем примере - обычный способ их создания - просто назначить им в методе __init__.
Исключением является случай, если ваш класс использует слоты, которые представляют собой фиксированный список атрибутов, которые класс разрешает иметь экземплярам. Слоты описаны в http://www.python.org/2.2.3/descrintro.html , но со слотами есть различные подводные камни; они влияют на структуру памяти, поэтому множественное наследование может быть проблематичным, и при наследовании в целом также должны учитываться слоты.
источник
Оба метода Vars () и dict будут работать для примера, опубликованного OP, но они не будут работать для «слабо» определенных объектов, таких как:
Чтобы распечатать все невызываемые атрибуты, вы можете использовать следующую функцию:
источник
exec('print object.%s\n\n') % i
должно быть написано какprint getattr(object, i)
Вы также можете проверить, есть ли у объекта конкретная переменная:
источник
В вашем примере показаны «переменные экземпляра», а не переменные класса.
Ищите
hi_obj.__class__.__dict__.items()
переменные класса вместе с другими членами класса, такими как функции-члены и содержащий модуль.Переменные класса используются всеми экземплярами класса.
источник
Предлагать
Другими словами, он просто обертывает __dict__
источник
Хотя это и не является прямым ответом на вопрос OP, есть довольно приятный способ узнать, какие переменные находятся в области видимости функции. взгляните на этот код:
Атрибут func_code содержит много интересного. Это позволяет делать классные вещи. Вот пример того, как я это использовал:
источник
построен на ответе dmark, чтобы получить следующее, что полезно, если вам нужен эквивалент sprintf и, надеюсь, кому-то поможет ...
источник
Иногда вам нужно отфильтровать список на основе общедоступных / частных переменных. Например
источник