В разнице Python в __dict__ между объектом() и классом myClass (объект)

Я возился с динамическими атрибутами, и я заметил, что не могу использовать атрибут __dict__, если я создал объект непосредственно из класса object(), но если я создам новый класс, являющийся прямым потомком объекта, я могу получить доступ к __dict__. Почему разница?

Примеры:

# This gives an AttributeError  
o = object()
o.__dict__
# This works: prints {}
class myClass(object):
    pass
o = myClass()
o.__dict__

Ответ 1

object реализован в C и не имеет атрибута __dict__. (Не все объекты Python тоже есть, посмотрите __slots__).

Ответ 2

Я не совсем уверен, почему он работает для вашего класса, но не для исходного класса object. Я бы предположил, что когда ваш класс инициализируется, он создает __dict __.

Используя этот код:

class Test(object):
    def __init__(self):
        pass

def main():
    print 'OBJECT:', dir(object())
    print
    print 'TEST:', dir(Test())
    return

Подключитесь к этому выводу:

OBJECT: ['__class__', '__delattr__', '__doc__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__']

TEST: ['__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', '__weakref__']

Как вы можете видеть, __dict__, __module__ и __weakref__ находятся в объекте Test, но не в базовом объекте