2014-01-09 5 views
0

У меня есть экземпляр класса типа <class 'openstack_dashboard.api.nova.Server'>:метод класса Python

>>>print instance 
>>><Server: {'id': u'9fa3b2e9-a76b-44ae-be75-968d4010eb27', 
       'links': [{u'href': u'http://10.0.3.129:8774/v2/344f7fa036fc45008130cdf1cffac019/servers/9fa3b2e9-a76b-44ae-be75-968d4010eb27', u'rel': u'self'}, 
         {u'href': u'http://10.0.3.129:8774/344f7fa036fc45008130cdf1cffac019/servers/9fa3b2e9-a76b-44ae-be75-968d4010eb27', u'rel': u'bookmark'}]}> 
>>> print dir(instance) 
>>> ['__class__', '__delattr__', '__dict__', '__doc__', '__format__', 
     '__getattr__', '__getattribute__', '__hash__', '__init__', 
     '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', 
     '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 
     '__weakref__', '_apiresource', '_attrs', 'image_name', 
     'internal_name', 'request'] 

Я хочу, чтобы получить 'id' ('9fa3b2e9-a76b-44ae-be75-968d4010eb27'). Что мне делать? Спасибо !

+0

Я думаю 'print instance.id' – p99will

+0

@ p99will - маловероятно. Нет атрибута 'id', если вы посмотрите на вывод' dir'. – mgilson

+0

Как вы создали экземпляр? – rednaw

ответ

2

Согласно тому, что я могу видеть в source, Server наследует от общего APIResourceWrapper, который, в свою очередь, реализует __gatattr__ так что id, в то время как это не совсем собственный атрибут объекта, будут взяты из внутреннего контейнера self._apiresource.

Таким образом, instance.id будет работать и будет эффективно возвращать instance._apiresource.id.

+0

Oh. Не могли бы вы сказать, должен ли я это делать? – changzhi

+0

Если вы хотите получить идентификатор, просто выполните 'instance.id'. – bereal

+0

WOW! Спасибо ! Оно работает! – changzhi

1

Класс openstack_dashboard.api.nova.Server наследует от openstack_dashboard.api.base.APIResourceWrapper и этот класс определил __getattr__() метод, который использует self._attrs, так что я думаю, что это должно быть возможно читать id таким образом:

print(instance.id) 
0

Это может работать сейчас для вас, но это зависит от реализации:

import re 
printed = instance.__str__() #might also be __repr__() 
m = re.search("'id'\s*:\s*u'([\w+\-]+)'", printed) 
m.groups(0)[0] #returns 9fa3b2e9-a76b-44ae-be75-968d4010eb27 
+0

Спасибо за ваш ответ, он может работать! Спасибо! – changzhi

+0

Спасибо за downvote :). Ну, вот почему я ответил в первую очередь. И это доказывает, что я могу видеть в будущем, поэтому я поставил «могу» и «внедряюще-зависимый» вверх. – MadeOfAir

+0

Нижняя часть - моя. Извините, я обычно никого не издеваюсь над этим, но это делает еще лучше codewtf, чем печально известный 'if (boolvalue.toString(). Length() == 4) {...}'. – bereal

Смежные вопросы