在Python中,对象和字典之间有什么区别?

Cep*_*pod 24 python object-model

创建对象后,我可以随意添加和删除插槽,就像我可以使用字典一样.甚至方法也只是存储在槽中的对象,所以我可能也可以将方法添加到字典中.

我可以用一个(非字典)对象做一些我永远不会用字典做的事情吗?或者是否可以设置一个完全看起来像某个类的对象的字典?

这个问题不是关于它们是如何创建的,而是关于我以后如何使用它们的问题.链接或参考表示赞赏.

agf*_*agf 17

创建对象后,我可以随意添加和删除插槽,就像我可以使用字典一样.甚至方法也只是存储在插槽中的对象,

小心说插槽 - __slots__在Python中具有特定含义.

所以我可能也可以在字典中添加方法.

foo = {}
foo.bar = 1

AttributeError: 'dict' object has no attribute 'bar'
Run Code Online (Sandbox Code Playgroud)

默认情况下,您不需要对其进行子类化 - 但之后您正在使用类.相反,将函数放在字典中:

def bar():
    return 1

foo['bar'] = bar
foo['baz'] = lambda: 1
Run Code Online (Sandbox Code Playgroud)

我可以用一个我永远不能用字典做的对象吗?

这个问题实际上有一个错误的前提 - 词典是对象,所以你用一个对象的字典任何事情.对于这个答案的其余部分,当你说"对象"时,我会假装你的意思是"用户定义的类".

不,您无法使用字典无法处理的用户定义的类.甚至用字典实现类.

class Foo(object):
    pass

print Foo.__dict__
# {'__dict__': <attribute '__dict__' of 'Foo' objects>, '__module__': '__main__', 
#      '__weakref__': <attribute '__weakref__' of 'Foo' objects>, '__doc__': None}
Run Code Online (Sandbox Code Playgroud)

你可以用Python中的一个类做任何事情,你可以做更多的工作(以及更难理解,使用和维护的代码).甚至有人说Python类只是字典的语法糖.

最近有一个非常相似的问题,我是否需要了解对象,还是可以节省时间并学习字典?我认为我的回答在这里也很重要.


sth*_*sth 11

当您调用对象的成员函数时,它们将作为第一个参数传递给对象本身.这样他们就可以修改他们所属对象的属性:

class Counter(object):
   def __init__(self):
      self.num = 0

   def inc(self):
      self.num += 1

count = Counter()
count.inc()
Run Code Online (Sandbox Code Playgroud)

如果你只是将一堆函数存储在a中dict,它们就不会得到这样的支持.你必须手动传递dict以达到同样的效果:

def Counter_inc(d):
   d['num'] += 1

def Counter_create():
   d = {
      'num': 0,
      'inc': Counter_inc,
   }
   return d

count = Counter_create()
count['inc'](count)
Run Code Online (Sandbox Code Playgroud)

正如你可以看到的那样,它更加笨拙.虽然您可以使用原始dicts模拟对象的许多功能,但对对象具有特殊语言支持使它们更易于使用.

还有一些功能可以直接使用对象类型信息,例如isinstance(),使用原始dicts无法轻松复制.