В Python, в чем разница между объектом и словарем? - PullRequest
23 голосов
/ 19 августа 2011

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

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

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

Ответы [ 5 ]

16 голосов
/ 19 августа 2011

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

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

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

11 голосов
/ 19 августа 2011

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

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(), который не может быть легко воспроизведен с необработанными диктовками.

3 голосов
/ 19 августа 2011

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

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

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

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

1 голос
/ 27 января 2018

Объект - это {}, созданный из класса:

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}
1 голос
/ 19 августа 2011

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

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 принимает себя в качестве первого параметра, а o1["some_method"] нет.

...