【问题标题】:When and why might I assign an instance of a descriptor class to a class attribute in Python rather than use a property?我何时以及为什么可以将描述符类的实例分配给 Python 中的类属性而不是使用属性?
【发布时间】:2011-08-16 02:27:12
【问题描述】:

我知道属性一个描述符,但是有没有具体的例子说明什么时候使用描述符类可能更有利,pythonic,或者比在一个上使用@property 提供一些好处方法函数?

【问题讨论】:

  • 为什么属性是描述符?

标签: python descriptor


【解决方案1】:

更好的封装性和可重用性:描述符类可以在实例化时设置自定义属性。有时以这种方式限制数据很有用,而不必担心它会被描述符的所有者设置或覆盖。

【讨论】:

  • 谢谢!所以基本上你可以从实例化描述符的类中分离出描述符的职责?!太棒了!
  • 可能性实际上是无限的 ;) 考虑诸如延迟加载之类的事情:设置一串你想要稍后在第一次访问描述符时加载的东西,再也不用担心这个了。或者从所有者类中删除杂乱,并将其放在逻辑所属的位置。
  • @möter 设置你想稍后加载的字符串你可以使用@property做同样的事情,不是吗?
  • @PiotrDobrogost 当然可以。但至少需要另一个声明才能做到这一点,对吧?
  • 我们可以将描述符应用于实例方法吗?
【解决方案2】:

让我引用 EuroPython 2012 精彩视频"Discovering Descriptors"

如何在描述符和属性之间进行选择:

  • 属性在了解类时效果最佳
  • 描述符更通用,通常可以应用于任何类
  • 如果类和实例的行为不同,请使用描述符
  • 属性是语法糖

另外,请注意,您可以将__slots__ 与描述符一起使用。

【讨论】:

    【解决方案3】:

    @property 不允许您同时定义专用的 setter 和 getter 方法。 如果 getter 方法“足够好”,则使用 @property 否则您需要 property()。

    【讨论】:

    • 为什么我更喜欢财产而不是像@my_method_name.setter这样的东西?另外,这如何适用于自定义描述符类的概念?
    猜你喜欢
    • 2015-07-16
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-01
    • 2012-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多