Создает ли 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 . Вы можете создавать свои собственные дескрипторы, создавая целый ряд интересных способов привязки.

  • модели django и дизайн ООП
  • Создание метода private в подклассе python
  • Добавление метода к существующему экземпляру объекта
  • Что делает «супер» в Python?
  • Частные члены в Python
  • Переменные экземпляра объекта внутри класса
  • Значение @classmethod и @staticmethod для начинающих?
  • Почему класс Python не распознает статическую переменную
  • где в иерархии классов должны быть написаны методы экземпляра?
  • Как реализовать двоичное дерево поиска в Python?
  • глубина дерева python
  • Python - лучший язык программирования в мире.