вызов функции из класса против объекта в Python - PullRequest
0 голосов
/ 15 мая 2018

Я на самом деле просматривал дескрипторы документы Python и наткнулся на этот пример

>>> class D(object):
     def f(self, x):
          return x

>>> d = D()
>>> D.__dict__['f'] # Stored internally as a function
<function f at 0x00C45070>
>>> id(D.__dict__['f']) # Memory location
49294384
>>> D.f             # Get from a class becomes an unbound method
<unbound method D.f>
>>> id(D.f )
48549440
>>> d.f             # Get from an instance becomes a bound method
<bound method D.f of <__main__.D object at 0x00B18C90>>
>>> id(d.f)
48549440

Итак, из приведенного выше кода я понял, что Python хранит function definition/declaration класса какотдельный объект внутри переменной класса __dict__, когда мы обращаемся напрямую с помощью переменной __dict__, она имеет место в памяти как 49294384

Но почему он отображается как другой объект функции / метода с разными memory location 48549440 при доступе через Class or Object? как D.f and d.f

не предполагалось ли ссылаться на один и тот же объект при доступе с помощью переменной __dict__?Если так, почему?

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

xtofi объяснил разницу между объектами дескриптора (несвязанными) и связанными методами.

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

Почему? Потому что при каждом вызове дескриптор может привести к другому поведению. Вот пример, чтобы объяснить эту идею.

class A(object):
    i = 'a'

    @property
    def name(self):
        if A.i == 'a':
            return self.fa()
        else:
            return self.fb()

    def fa(self):
        print 'one function'

    def fb(self):
        print 'another function'

Вызов функции name для экземпляра A приводит к вызовам различных функций.

0 голосов
/ 15 мая 2018

D.f - функция, принимающая один аргумент (self)

x = D.f
x(d)

d.f - это «связанный метод», то есть функция, в которой аргумент self уже введен. Вы можете сказать

x = d.f
x()

Поэтому он не может быть тем же самым, что и D.f, и должен находиться в другом месте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...