Доступ к атрибутам класса родительских классов - PullRequest
2 голосов
/ 05 ноября 2010

Я хотел бы знать, как лучше всего получить все атрибуты класса, когда я не знаю их имени.

Допустим, у меня есть:

#!/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 () , которая выдала бы все доступные атрибуты экземпляра?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 05 ноября 2010

Я думаю, что вы ищете dir() - он работает так же хорошо в коде, как и в оболочке.

1 голос
/ 05 ноября 2010

Попробуйте dir(b).Полученный список содержит унаследованные атрибуты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...