Ответ 1
object
реализован в C и не имеет атрибута __dict__
. (Не все объекты Python тоже есть, посмотрите __slots__
).
Я возился с динамическими атрибутами, и я заметил, что не могу использовать атрибут __dict__, если я создал объект непосредственно из класса object(), но если я создам новый класс, являющийся прямым потомком объекта, я могу получить доступ к __dict__. Почему разница?
Примеры:
# This gives an AttributeError o = object() o.__dict__
# This works: prints {}
class myClass(object):
pass
o = myClass()
o.__dict__
object
реализован в C и не имеет атрибута __dict__
. (Не все объекты Python тоже есть, посмотрите __slots__
).
Я не совсем уверен, почему он работает для вашего класса, но не для исходного класса 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, но не в базовом объекте