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

30 投票
5 回答
14225 浏览
提问于 2025-04-16 23:56

在创建一个对象之后,我可以随意添加和删除属性,就像操作字典一样。甚至方法也是存储在属性里的对象,所以我可能也可以把方法加到字典里。

有没有什么是我能在一个(非字典)对象上做的,而在字典上却做不到的呢?或者说,是否可以设置一个字典,让它完全看起来像某个类的对象?

这个问题不是关于它们是怎么创建的,而是关于我之后怎么使用它们。如果有相关的链接或参考资料,那就太好了。

相关问题:

5 个回答

3

其他的回答有一定道理,但我想补充一点,你不能对特定的字典进行子类化或实例化。

class A(object): pass
class B(A): pass
a = A()

A = {}
B = ???
a = ???

所以,字典是一种对象,而对象主要是用字典来实现的(虽然我不太清楚具体细节),但它们是用来做不同事情的不同工具。

20

在创建一个对象之后,我可以随意添加和删除属性,就像操作字典一样。甚至方法也是存储在属性里的对象。

要小心使用“属性”这个词——__slots__在Python中有特定的含义

所以我可能也可以往字典里添加方法。

foo = {}
foo.bar = 1

AttributeError: 'dict' object has no attribute 'bar'

默认情况下是不能的,你需要创建一个子类——但那样你就用上了类。相反,可以把函数放在字典里:

def bar():
    return 1

foo['bar'] = bar
foo['baz'] = lambda: 1

有没有什么是我能在对象上做的,而在字典上做不到的呢?

这个问题其实是个错误的前提——字典本身就是对象,所以你在字典上做的任何事情都是在对象上做的。接下来我会假装你说的“对象”是指“用户定义的类”。

不,没有什么是你能在用户定义的类上做的,而在字典上做不到的。类的实现甚至是用字典来完成的。

class Foo(object):
    pass

print Foo.__dict__
# {'__dict__': <attribute '__dict__' of 'Foo' objects>, '__module__': '__main__', 
#      '__weakref__': <attribute '__weakref__' of 'Foo' objects>, '__doc__': None}

在Python中,你能用类做的任何事情,都可以不使用类来完成,只是需要更多的工作(而且代码会更难理解、使用和维护)。甚至有人说Python的类只是字典的语法糖。

最近有个非常相似的问题被问到,链接是我需要学习对象吗,还是可以省时间只学习字典?我认为我的回答在这里也很相关。

16

当你调用一个对象的成员函数时,这个对象会作为第一个参数被传递给函数。这样,函数就可以修改它所属对象的属性:

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

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

count = Counter()
count.inc()

如果你只是把一堆函数放在一个 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)

正如你所看到的,虽然这样是可行的,但操作起来就麻烦多了。虽然你可以用普通的字典模拟很多对象的特性,但语言本身对对象的支持让它们更容易使用。

此外,还有一些功能直接使用对象的类型信息,比如 isinstance(),这些功能用普通字典很难实现。

撰写回答