2016-07-25 13 views
1

Согласно Python 2.7.12 документации, User-defined methods:Терминология: Пользовательский атрибут объекта функции?

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

Я знаю, что все в Python является объектом, поэтому «определенный пользователем метод» должен быть идентичен «определяемого пользователем метода объекта». Однако я не могу понять, почему существует «определяемый пользователем атрибут объекта функции». Скажем, в следующем коде:

class Foo(object): 
    def meth(self): 
     pass 

meth есть функция, определенная внутри тела класса, и, таким образом, в method. Итак, почему мы можем иметь «определяемый пользователем атрибут объекта функции»? Не все атрибуты определены внутри тела класса?


Bouns вопрос: Обеспечить некоторые примеры, иллюстрирующие, как определенный пользователем объект, метод создается с помощьюполучая атрибута класса. Разве объекты не определены в своем определении класса? (Я знаю, что методы могут быть назначены экземпляру класса, но это исправление обезьяны.)

Я прошу помощи, потому что эта часть документа действительно очень запутанна для меня, программист, который знает только C, поскольку Python такой магический язык, который поддерживает как функциональное программирование, так и объектно-ориентированный программист, которого я еще не освоил. Я много раз искал, но все еще не могу понять.

ответ

2

Когда вы

class Foo(object): 
    def meth(self): 
     pass 

вы определяете класс Foo с методом meth. Однако, когда это определение класса выполняется, для представления метода не создается объект метода. Оператор def создает обычный объект функции.

Если вы затем сделать

Foo.meth 

или

Foo().meth 

что поиск атрибута находит объект функции, а функция объект не используется в качестве значения атрибута. Вместо этого, используя descriptor protocol, Python вызывает метод объекта __get__ объекта функции для создания объекта метода, и этот объект метода используется как значение атрибута для этого поиска. Для объекта Foo.meth объект метода является объектом unbound method, который в основном ведет себя как функция, которую вы определили, но с некоторой дополнительной проверкой типа.Для Foo().meth объект метода является объектом связанного метода, который уже знает, что такое self.


Вот почему Foo().meth() не жалуется отсутствующего self аргумент; вы передаете 0 аргументам объекту метода, который затем добавляет self в (пустой) список аргументов и передает аргументы на базовый объект функции. Если Foo().meth оценивается непосредственно функцией meth, вам нужно будет передать ее self явно.


В Python 3, Foo.meth не создает объект метода; функция __get__ все еще вызывается, но она возвращает функцию напрямую, так как они решили, что объекты несвязанного метода не были полезны. Foo().meth все еще создает объект связанного метода.

+0

В цитате также сказано: «Когда атрибут представляет собой определяемый пользователем объект метода ...» Но как атрибуция класса может быть объектом _user-defined object_ вместо _быстрого объекта функции_? –

+0

Дополнительный вопрос: Не могли бы вы привести пример, иллюстрирующий разницу между ** классом, из которого он извлекается **, и ** классом, хранящимся в исходном объекте метода **? –

+1

@sunqingyao: 'class Foo (object): def method (self): pass',' class Bar (object): method = Foo.method'. Теперь класс 'Bar' имеет объект unbound method в своем dict, и этот метод несвязанных методов записывает, что он пришел из класса' Foo'. – user2357112

 Смежные вопросы

  • Нет связанных вопросов^_^