26

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

有没有我可以用字典做的(非字典)对象做的事情?或者是否可以建立一个完全看起来像某个类的对象的字典?

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

4

5 回答 5

19

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

小心说 slot -__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 类只是字典的语法糖。

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

于 2011-08-19T09:07:48.400 回答
13

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

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

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

count = Counter()
count.inc()

如果您只是将一堆函数存储在 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)

正如您所看到的,虽然它是可能的,但它更加笨拙。虽然您可以使用原始字典模拟对象的许多功能,但对对象具有特殊的语言支持会使它们更易于使用。

还有一些功能直接使用对象类型信息,例如isinstance(),不能用原始字典轻松复制。

于 2011-08-19T09:20:28.200 回答
3

其他答案有一定的根据,但我想补充一点,您不能子类化或实例化特定的字典。

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

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

所以,字典是对象,对象主要是用字典来实现的(虽然我不知道具体的),但它们是针对不同工作的不同工具。

于 2011-08-19T09:18:49.293 回答
1

我想你问

o1={"some_method": lambda par1, par2: par1+par2}
o1["some_method"](1, 2)

对比

class SomeClass:
    def some_method(self, par1, par2):
        return par1+par2

o2=SomeClass()
o2.some_method(1, 2)

? 如果是这样,我认为从实际角度来看的主要区别在于,o2.some_method将 self 作为第一个参数而o1["some_method"]不是。

于 2011-08-19T09:09:16.003 回答
1

Object 是从该类创建的 {}:

class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age

student1 = Student('John', 31) # student1 is an object
print(student1) # does not print the expected result, we need to "convert" it to dictionary
print(student1.__dict__) # prints {'name': 'John', 'age': 31}

字典是不是从类创建的 {}:

student2 = { 'name': 'Kevin', age: 15 } # student2 is a dictionary
print(student2) # prints {'name': 'Kevin', 'age': 15}
于 2018-01-27T13:45:16.497 回答