Подтвердить что ты не робот

В Python, в чем разница между объектом и словарем?

После создания объекта я могу добавлять и удалять слоты по своему усмотрению, как я могу сделать со словарем. Даже методы - это просто объекты, хранящиеся в слотах, поэтому я, вероятно, также могу добавить методы в словарь.

Есть ли что-то, что я могу сделать с (не-словарным) объектом, который я никогда не мог бы сделать со словарем? Или можно настроить словарь, который полностью похож на объект определенного класса?

Этот вопрос не о том, как они созданы, но о том, как я могу их использовать впоследствии. Ссылки или ссылки приветствуются.

4b9b3361

Ответ 1

Когда вы вызываете функции-члены объекта, они передают сам объект в качестве первого параметра. Таким образом, они могут изменять свойства объекта, к которому они принадлежат:

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

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

count = Counter()
count.inc()

Если вы просто храните кучу функций в 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)

Как вы можете видеть, пока это возможно, это гораздо более неуклюжий. Хотя вы можете эмулировать многие функции объекта с помощью raw dicts, наличие специальной поддержки языка для объектов упрощает их использование.

Также есть функции, которые непосредственно используют информацию типа объектов, например, isinstance(), которая не может быть легко реплицирована с помощью raw dicts.

Ответ 2

После создания объекта я могу добавлять и удалять слоты по своему усмотрению, как я могу сделать со словарем. Даже методы - это просто объекты, хранящиеся в слотах,

Будьте осторожны, говоря слоты - __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 - это просто синтаксический сахар для словарей.

Недавно был задан очень похожий вопрос как Мне нужно узнать об объектах, или я могу сэкономить время и просто изучить словари? Я думаю, что мой ответ на это также актуально здесь.

Ответ 3

Другие ответы содержат некоторые основания, но я хотел бы добавить, что вы не можете подклассы или создавать конкретные словари.

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

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

Итак, словари - это объекты, а объекты реализованы в основном со словарями (хотя я не знаю специфики), но они разные инструменты для разных заданий.

Ответ 4

Я думаю, вы спрашиваете о

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"] not.