В Python, в чем разница между объектом и словарем?
После создания объекта я могу добавлять и удалять слоты по своему усмотрению, как я могу сделать со словарем. Даже методы - это просто объекты, хранящиеся в слотах, поэтому я, вероятно, также могу добавить методы в словарь.
Есть ли что-то, что я могу сделать с (не-словарным) объектом, который я никогда не мог бы сделать со словарем?
Или можно настроить словарь, который полностью похож на объект определенного класса?
Этот вопрос не о том, как они созданы, но о том, как я могу их использовать впоследствии. Ссылки или ссылки приветствуются.
Ответы
Ответ 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.