2013-02-20 3 views
2

Надеюсь, этот вопрос не слишком открыт. Прочитав http://python-history.blogspot.com/2010/06/inside-story-on-new-style-classes.html, я, наконец, «получаю» дескрипторы в Python. Но все, что я видел на них, просто описывает, как их можно использовать для реализации статических методов, методов класса и свойств.Примеры использования дескрипторов в Python

Я ценю важность этих, но какие другие виды использования существуют для дескрипторов в Python? Какую магию я могу сделать, чтобы мой код мог быть реализован только с помощью дескрипторов (или, по крайней мере, лучше всего реализованных с использованием дескрипторов)?

+0

Я полагаю, вы знаете, что функции дескрипторы и осуществлять оценку (и несвязанных, в Python 2) методы таким образом? – delnan

+1

Справа. Чтобы выразить это по-другому, я хочу знать, что использует дескрипторы, кроме тех, которые уже встроены в язык. – asmeurer

+1

Жаль, что ваш интересный вопрос был закрыт в течение дня здесь. Обычный вариант использования - в конструкции ORM, например. Django использует [дескрипторы для реализации обратных отношений] (https://github.com/django/django/blob/9cfd060b1c0c3664d77e4ab30a6c351822f0a4d6/django/db/models/fields/related_descriptors.py#L468), которые вы получаете бесплатно на связанных объектах , – wim

ответ

3

Ленивый нагруженные свойства:

import weakref 
class lazyattribute(object): 
    def __init__(self, f): 
     self.data = weakref.WeakKeyDictionary() 
     self.f = f 
    def __get__(self, obj, cls): 
     if obj not in self.data: 
      self.data[obj] = self.f(obj) 
     return self.data[obj] 
class Foo(object): 
    @lazyattribute 
    def bar(self): 
     print "Doing a one-off expensive thing" 
     return 42 
>>> f = Foo() 
>>> f.bar 
Doing a one-off expensive thing 
42 
>>> f.bar 
42 
+0

Так что в основном кеширование. – asmeurer

+0

@asmeurer: По существу, да – Eric

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