Объекты против экземпляра в python

В C ++ существуют только объекты и классы, где объекты являются экземплярами классов.

В Python определение класса (т. Е. Тело класса) называется объектом. И, объект в C ++ называется экземпляром в python.

Проверьте это

Я ошибаюсь?

EDIT: На самом деле, кто-то может объяснить пример разницы между объектом и экземпляром

EDIT: В python все будет наследоваться от класса объекта и, следовательно, все будет объектом (т.е. объектом класса объекта ).

Класс также является объектом (т.е. объектом класса объектов ).

Экземпляр – это имя, используемое для вызова объекта любого класса. (Aka c ++ object).

Пожалуйста, обратитесь к этому

5 Solutions collect form web for “Объекты против экземпляра в python”

В Python определение класса (т. Е. Тело класса) называется объектом

На самом деле это все еще называется классом в Python. Вот почему вы определяете его так:

 class Foo(object): pass 

Ключевое слово class используется, потому что результат по-прежнему называется классом.

Объект слова находится в круглых скобках, чтобы показать, что Foo является производным от класса, называемого object . Не путайте – здесь можно использовать любой существующий класс; более чем на самом деле.

Причина, по которой вы обычно извлекаете классы из object является исторической катастрофой, но, вероятно, стоит детализировать. Первоначальная реализация объекта Python рассматривала пользовательские классы и встроенные типы как слегка разные вещи. Тогда дизайнер языка решил объединить эти два понятия. В результате классы, полученные из object (или из потомка object ), ведут себя несколько иначе, чем классы, которые не производны от object и называются классами нового стиля. С другой стороны, классы старого стиля были такими, как:

 class Foo: pass class Bar(Foo): pass 

Обратите внимание, что они не наследуются от object или от чего-либо другого, наследующего от object . Это делает их классами старого стиля.

При работе с Python 2.x ваши классы должны почти всегда наследоваться от object , поскольку объекты нового стиля лучше работают с несколькими небольшими, но важными способами.

Чтобы еще больше запутать вещи, в Python 3.0 и более поздних версиях нет классов старого стиля, поэтому вам не нужно явно выводить из object . Другими словами, все вышеперечисленные классы были бы классами нового стиля в Python 3.x.

Теперь вернемся к делу. Классы – это объекты, потому что все объекты в Python. Списки, словари, целые числа, строки, кортежи … все это объекты, а также строительные блоки программ Python: модули, функции и классы. Вы можете создать класс, используя ключевое слово class а затем передать его функции, изменить ее и т. Д. (Для полноты вы также можете создать класс с помощью функции type() .)

Класс – это шаблон для создания объектов, которые называются экземплярами. Эта часть, которую вы уже знаете. Вы создаете объекты, подобные вызову функции, передавая начальные значения и другие параметры:

 mylist = list("abc") # constructs ["a", "b", "c"] 

За кулисами это создает экземпляр, а затем вызывает метод __init__() нового экземпляра для его инициализации. Поскольку все объекты Python являются объектами, экземпляры класса также являются объектами.

Последнее, что вы, возможно, захотите узнать, это то, что так же, как классы являются шаблонами для построения объектов, возможно, есть шаблоны для создания классов. Они называются метаклассами. Базовый метакласс называется type (то есть обычный класс нового стиля является экземпляром type ).

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

Чтобы создать свой собственный метакласс, вы получите его из следующего type :

 class mymeta(type): pass 

Метаклассы – довольно продвинутая тема Python, поэтому я не буду вдаваться в то, что вы могли бы использовать для них или как это сделать, но они должны дать понять, насколько Python использует концепцию «все является объектом».

Все в Python – это объект. Даже классы, являющиеся экземплярами метаклассов .

Терминология, классы и экземпляры называются объектами в Python, но для вас как обычного программиста на Python это не имеет значения. Вы можете видеть классы и экземпляры Python в значительной степени как классы и экземпляры C ++:

 class MyClass: data = 1 mc = MyClass() 

MyClass – это класс, а mc – это экземпляр класса MyClass .


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

Поскольку вы попросили «english please», я постараюсь сделать это простым ценой деталей.

Давайте сначала проигнорируем классы и экземпляры и просто посмотрим на объекты.

Объект Python содержит данные и функции , подобно объектам на всех других объектно-ориентированных языках программирования. Функции, связанные с объектами, называются методами .

 x = "hello" #now x is an object that contains the letters in "hello" as data print x.size() #but x also has methods, for example size() print "hello".size() #In python, unlike C++, everything is an object, so a string literal has methods. print (5).bit_length() #as do integers (bit_length only works in 2.7+ and 3.1+, though) 

Класс – это описание (или рецепт, если хотите) о том, как создавать новые объекты. Объекты, построенные в соответствии с описанием класса, считаются принадлежащими этому классу. Причудливое имя для принадлежности к классу должно быть экземпляром этого класса.

Теперь, ранее я написал, что в Python все является объектом. Ну, это относится и к вещам вроде функций и классов. Поэтому описание того, как создавать новые объекты, само является объектом.

 class C: #C is a class and an object a = 1 x1 = C() #x1 is now an instance of C print x1.a #and x1 will contain an object a y = C #Since C is itself an object, it is perfectly ok to assign it to y, note the lack of () x2 = y() #and now we can make instances of C, using y instead. print x2.a #x2 will also contain an object a print C #since classes are objects, you can print them print y #y is the same as C. print y == C #really the same. print y is C #exactly the same. 

Это означает, что вы можете рассматривать классы (и функции), как и все остальное, и, например, отправлять их в качестве аргументов функции, которые могут использовать их для построения новых объектов класса, которого он никогда не знал.

В очень реальном смысле все в Python является объектом: класс (или любой тип) – это объект, функция – это объект, число – это объект … И каждый объект имеет тип. «Тип» – это особый тип объекта (класс, если хотите), с дополнительными данными, описывающими различные атрибуты типа (функции и т. Д.). Если вы привыкли к C ++, вы можете думать о нем как о чем-то вроде:

 struct Type; struct Object // The base class of everything. { Type* myType; // Some additional stuff, support for reference counting, etc. }; struct Type : Object { // Lots of additional stuff defining type attributes... }; 

Когда вы определяете новый класс в Python, вы действительно просто создаете новый экземпляр Type; когда вы создаете экземпляр этого класса, Python инициализирует член myType указателем на правильный экземпляр Type .

Обратите внимание, однако, что все динамично. Когда вы определяете тип Toto (путем выполнения определения класса – даже определение типа – это время выполнения, а не время компиляции, как в C ++), интерпретатор Python создает экземпляр Type и помещает его в словарь ( map<string, Object*> , на языке C ++). Когда интерпретатор сталкивается с утверждением вроде:

 x = Toto() 

, он ищет Toto в словаре: если Object имеет тип Type , он создает новый экземпляр этого объекта, если он имеет тип Function (функции также являются объектами), он вызывает функцию. (В более общем смысле, тип / класс может быть вызван или нет, если тип Object найденного в словаре под Toto является вызываемым, интерпретатор Python делает то, что обозначил объект «вызов». Тип вроде operator()() перегрузки operator()() в C ++. Перегрузка operator()() для Type – это создание нового объекта этого типа.)

И да, если вы исходите из классического фона – строго процедурного, структурированного, полностью скомпилированного языка, это может быть довольно запутанным вначале.

  • python ctypes и sysctl
  • python bindings, как это работает?
  • «Матричное разложение» матрицы с голонической субструктурой
  • Установлен ли PyObjC на OSX SL?
  • Отменить шрифт PDF со скриптом
  • Лучший способ создать класс «generic», наследующий внешние классы модулей
  • Как воспроизвести System.Security.Cryptography.SHA1Установленный результат в Python
  • Как работает Boost.Python?
  • Библиотеки DNS-резольвера с поддержкой DNSSEC и / или экспериментальные новые типы RR
  • Получение информации о другой программе в качестве входных данных на лету
  • Самый простой способ сжимать в Python и распаковывать с помощью распаковки C # (и наоборот)
  • Python - лучший язык программирования в мире.