2015-06-29 6 views
0

Этот простой класс, я просто хочу, чтобы проверить функцию о __get__() Код является:Смущает питона дескрипторы и __get __()

class Des(object): 
    def __init__(self,num): 
     self.num = num 
    def __get__(self, obj, typ = None): 
     return self.num 

class A(object): 
    des = Des(1) 
    print 'the des in class is ',des 

a = A() 
print 'the des in object is ',a.des 
print a.__dict__ 
print A.__dict__ 

выход:

the des in class is <Des object at 0x7f5fb550ded0> 
the des in object is 1 
{} 
{'__dict__': <attribute '__dict__' of 'A' objects>, '__module__': '__builtin__', 'des': <Des object at 0x7f5fb550ded0>, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None} 

мой вопрос почему причины выходов des равны des (один - 1 type(int), один - объект type(Des)). И выход a.__dict__ и A.__dict также отличается. Какова функция __get__() и как ее использовать.

+3

Откуда у вас возникла мысль, что '__get__' имеет какое-либо отношение к атрибутам и' __dict__'? Он является частью протокола * дескриптора *; методы и свойства связывания. –

+0

Насколько вы уже разбираетесь в дескрипторах? Является ли мой [ответ на объекты 'property' (https://stackoverflow.com/questions/17330160/how-does-the-property-decorator-work/17330273#17330273) вообще здесь? –

+0

и, возможно, [Дескрипторы и прямой доступ: ссылка Python] (https://stackoverflow.com/q/19409373) также актуальны. –

ответ

0

Почему выходные данные des различаются (один из них 1 тип (int), один тип объекта (Des)).

В первом случае вы печатаете экземпляр Des в теле оператора класса A. На данный момент это не что иное, как обычный объект Python - нет протокола дескриптора, поскольку вы не выполняете доступ к атрибуту для класса или экземпляра, так как класс A еще не существует, поэтому вы получаете стандартное представление Des объект.

Во втором случае вы просматриваете (доступ к атрибуту) имя des по экземпляру A. Механизм разрешения атрибута (реализовано в object.__getattribute__) находит имя des в A.__dict__ и обнаруживает связанный объект реализует __get__, поэтому он вызывает A.__dict__["des"].__get__(a, A) и возвращает результат. - в этом случае А. ДИКТ [ «дез»] Num , which is INT (1) `.

И выходы a.__dict__ и A.__dict__ также различны.

Да, конечно. A.__dict__ является типом класса A, a.__dict__ является типом экземпляра a. Почему вы ожидаете, что тот же будет делиться одним и тем же dict?

Что является функцией __get__() и как ею пользоваться.

Ссылки Martijn Pieters будут отвечать на этот вопрос.

+0

, спасибо за ваш ответ, это очень помогает мне, и большинство моих замешательств. –

+0

@ArthurGeorge, затем не стесняйтесь повышать и принимать его. –

+0

благодарит ваш ответ, он очень помогает мне, и он решил большую часть моей Confusion. Но у меня все еще есть вопрос. сначала, как знает интерпретатор python для вызова A .__ dict __ ["des"] .__ get __ (a, A). Я думаю, он проверит, поддерживает ли связанный объект (Des) __get__ methond. Rigth ?? –

0

в вашем коде des является атрибутом класса и в дескрипторе он (класс атр) будет называть get(), в следующем a.des вызывает метод call() так, то причина вы получили другой результат вывода (в вашем примере выводе).