Я хотел бы знать, как лучше всего получить все атрибуты класса, когда я не знаю их имени.
Допустим, у меня есть:
#!/usr/bin/python2.4
class A(object):
outerA = "foobar outerA"
def __init__(self):
self.innerA = "foobar innerA"
class B(A):
outerB = "foobar outerB"
def __init__(self):
super(B, self).__init__()
self.innerB = "foobar innerB"
if __name__ == '__main__':
b = B()
Использование hasattr / getattr для получения поля класса "outerA" моего экземпляра b работает нормально:
>>> print hasattr(b, "outerA")
>>> True
>>> print str(getattr(b, "outerA"))
>>> foobar outerA
Хорошо, это хорошо.
Но что, если я точно не знаючто b унаследовал поле с именем "externalA", но я все еще хочу его получить?
Чтобы получить доступ к внутренним полям b, я обычно использую b.__dict__
.Чтобы получить b.outerB
, я могу использовать b.__class__.__dict__
, но в его полях все еще не отображается "outerA":
>>> print "-------"
>>> for key, val in b.__class__.__dict__.iteritems():
... print str(key) + " : " + str(val)
>>> print "-------\n"
Показывает:
-------
__module__ : __main__
__doc__ : None
__init__ : <function __init__ at 0xb752aaac>
outerB : foobar outerB
-------
Где мой outerA
??: D
Я уверен, что могу продолжать "лазить" по иерархии классов и получать все поля, но это не кажется лучшим решением ...
Поскольку есть hasattr (), getattr () ... не существует ли что-то вроде listattr () , которая выдала бы все доступные атрибуты экземпляра?
Спасибо!