Создает ли Python весь связанный метод для каждого нового экземпляра?

Я читаю о классах в Python (3.4), и, насколько я понимаю, каждый новый объект имеет свои собственные экземпляры связанных методов.

class A: def __init__(self, name): self.name = name def foo(self): print(self.name) a = A('One') b = A('Two') print(a.foo == b.foo) 

Результатом этого является False .

Это кажется мне пустой тратой памяти. Я думал, что внутренне a.foo и b.foo будут как-то внутренне указывать на одну функцию в памяти: A.foo где будет передаваться сам экземпляр класса.

Я предполагаю, что это, возможно, не может быть легко реализовано на языке.

Каждый новый экземпляр содержит также новые экземпляры связанных методов?

Если это так, разве это не повредит производительности или делает случай для создания новых объектов более осторожно, чем на других языках, где методы «разделяются» между такими объектами, как Java ?

One Solution collect form web for “Создает ли Python весь связанный метод для каждого нового экземпляра?”

Методы связаны по требованию , каждый раз, когда вы обращаетесь к нему.

Доступ к имени функции вызывает протокол дескриптора , который на объектах функции возвращает связанный метод.

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

Методы не создаются при создании экземпляра, поэтому дополнительной памяти не требуется априори.

Вы можете повторно создать шаги вручную:

 >>> class A: ... def __init__(self, name): ... self.name = name ... def foo(self): ... print(self.name) ... >>> a = A('One') >>> a.foo <bound method A.foo of <__main__.A object at 0x100a27978>> >>> a.foo.__self__ <__main__.A object at 0x100a27978> >>> a.foo.__func__ <function A.foo at 0x100a22598> >>> A.__dict__['foo'] <function A.foo at 0x100a22598> >>> A.__dict__['foo'].__get__(a, A) <bound method A.foo of <__main__.A object at 0x100a27978>> >>> A.__dict__['foo'].__get__(a, A)() One 

Каждый раз воссоздается только объект метода; основная функция остается стабильной:

 >>> a.foo is a.foo False >>> b = A('Two') >>> b.foo is a.foo False >>> b.foo.__func__ is a.foo.__func__ True 

Эта архитектура также создает classmethod , staticmethod и property . Вы можете создавать свои собственные дескрипторы, создавая целый ряд интересных способов привязки.

  • В Python, когда два объекта одинаковы?
  • Как объявить значения по умолчанию для переменных экземпляра в Python?
  • Несколько объектов каким-то образом мешают друг другу
  • где в иерархии классов должны быть написаны методы экземпляра?
  • Что делает «супер» в Python?
  • Использование класса в качестве типа подсказки для аргументов в его методах
  • Является ли хорошей практикой делать вложенный класс в python?
  • Создание пустого объекта в Python
  •  
    Interesting Posts for Van-Lav

    Использование MySQL с Django – доступ запрещен для пользователя '@' localhost

    Получение ошибки gcc при установке scrapy

    Добавление текста справки по модели в форму администратора django

    Numpy перемещает многомерный массив только по строке, сохраняет порядок столбцов без изменений

    Django: значение параметра отображения

    Цвет фона строки PyQt Tableview, основанный на значении ячейки

    Django Rest Framework 3.4. Сериализация внешнего ключа и загрузка файла изображения

    Доцент и относительный импорт

    кастинг необработанных строк python

    ошибки синтаксиса журнала и неперехваченные исключения для подпроцесса python и распечатать их на терминале

    Как повторить фрагмент кода определенное количество раз в python

    Создана таблица из списка, не отображающая все элементы

    Выполнение скрипта Python из Java в проекте Tomcat

    Начальная практика Python?

    Могу ли я использовать ForeignKey в возврате __unicode__?

    Python - лучший язык программирования в мире.