【问题标题】:Examples of uses of descriptors in Python [closed]Python中描述符的使用示例[关闭]
【发布时间】:2013-02-20 20:16:07
【问题描述】:

我希望这个问题不要太开放。在阅读了http://python-history.blogspot.com/2010/06/inside-story-on-new-style-classes.html 之后,我终于在 Python 中“获得”了描述符。但是我在它们上看到的所有内容都只是描述了它们如何用于实现静态方法、类方法和属性。

我很欣赏这些的重要性,但是 Python 中的描述符还有哪些其他用途?我希望我的代码有什么样的魔力,只能使用描述符来实现(或者至少最好使用描述符来实现)?

【问题讨论】:

  • 我假设您也知道函数是描述符并以这种方式实现绑定(和未绑定,在 Python 2 中)方法?
  • 对。换一种说法,我想知道除了那些已经内置在语言中的描述符之外,还有什么用途。
  • 很遗憾您的有趣问题在一天之内就被关闭了。一个常见的用例是在 ORM 的设计中,例如Django 使用您在相关对象上免费获得的descriptors to implement the reverse relations
  • @wim 不幸的是,这个网站上的问题关闭有点随机。我投票决定重新开放。我仍然对 Python 的这个神秘特性感到好奇。
  • @asmeurer:无论如何,这个问题的答案可能最好作为示例放在新的文档功能中。最接近的原因在技术上是正确的(这个问题没有正确答案),但这并不意味着讨论没有价值。

标签: python descriptor


【解决方案1】:

延迟加载的属性:

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

【讨论】:

  • 所以基本上是缓存。
  • @asmeurer:基本上是的
猜你喜欢
  • 1970-01-01
  • 2011-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多