Python中object()与类myClass(object)的__dict__差异

14 投票
2 回答
2295 浏览
提问于 2025-04-16 17:23

我在玩动态属性的时候,发现如果我直接用object()类创建对象,就不能使用__dict__这个属性。但是如果我创建一个直接继承自object的新类,就可以访问__dict__属性。为什么会有这样的区别呢?

举个例子:

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

2 个回答

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 对象中有,但在基础对象中没有。

10

object 是用 C 语言实现的,它没有 __dict__ 这个属性。其实,并不是所有的 Python 对象都有这个属性;你可以查一下 __slots__ 的相关内容。

撰写回答