dir () атрибут __class__?

1
class Foo:
  pass

>>> f = test.Foo()

Давайте рассмотрим экземпляр класса...

>>> dir(f)
['__add__', [__class__] ...]

Оооо! Давайте рассмотрим метаданные экземпляра класса...

>>> dir(f.__class__)
['__add__', [__class__] ...]

хм... ожидал атрибутов __class__; но возвращает атрибуты f

Попытка хита и испытания...

>>> dir(f.__class__.__class__)
['__abstractmethods__', '__base__' ...]

хм... почему дважды обаяние?

  • 0
    У меня есть чувство, что это поведение зависит от вашей версии Python. Я получаю другое поведение в 2.6. Какую версию ты используешь?
  • 0
    Здесь также есть разница между результатами, полученными для классов нового стиля и классов старого стиля.
Показать ещё 1 комментарий
Теги:

1 ответ

6
Лучший ответ

dir(f) и dir(f.__class__) показывают атрибуты двух разных вещей. Это просто, что ваш пустой объект имеет те же атрибуты, что и его собственный класс. Попробуй это:

>>> class Foo:
...  def __init__(self):
...   self.a = 17
...
>>> f = Foo()
>>> 'a' in dir(f)
True
>>> 'a' in dir(f.__class__)
False
  • 0
    Хорошо! но в чем разница между dir(f.__class__) и dir(f.__class__.__class__) ? (Я знаю, что __name__ и __bases__ являются __class__ но я не вижу его в f.__class__ )
  • 1
    К сожалению, у объекта могут быть атрибуты, о которых dir () не сообщает.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню