【问题标题】:What is an effective way to test if a descriptor has already been unwrapped or not?测试描述符是否已经解包的有效方法是什么?
【发布时间】:2018-05-02 04:04:02
【问题描述】:

假设我们有以下类:

class K:
    # classmethod creates a descriptor
    @classmethod 
    def cm(cls, a, b, c):
        pass

现在,我们通过以下方式获取cm属性:

import random
getters = [
    lambda attr_name: object.__getattribute__(K, '__dict__')[attr_name]
    lambda attr_name: getattr(cm, attr_name)
]
geht = random.choice(getters)
cm = geht('cm')

什么是测试我们刚刚得到哪个cm 的有效方法?
(我们无法直接访问K类,只有geht返回的cm

random.choice 非常做作,但在某些情况下,我们有一个伪属性容器,我们想要验证它们是否都尚未解包,或者验证它们是否已解包。 一种失败的方法

人们可能会认为描述符具有__get__() 方法,而__get__() 返回的对象没有。

但是,用@classmethod 修饰的函数的__get__ 方法返回一个也有__get__ 方法的对象。

封装和解封装类方法的属性
# still wrapped cm 
type                <class 'classmethod'>
hasattr  __get__    True
hasattr  __call__   False

# unwrapped cm
type                <class 'method'>
hasattr  __get__    True
hasattr  __call__   True

我很想我们可以测试伪属性,看看它是否有__call__ 方法。但是,我希望该解决方案适用于一般的描述符,而不仅仅是classmethods。对于具有__get__ 方法的类的任何属性d,最好确定某个引用ref 是对d 的引用还是d.__get__() 返回的值(假设d.__get__()不返回d)

【问题讨论】:

    标签: python python-3.x class descriptor python-descriptors


    【解决方案1】:

    没有通用的解决方案。任何可能的描述符也是可能的__get__ 返回值。您需要更多信息,而不仅仅是对象来确定这一点。

    【讨论】:

      猜你喜欢
      • 2015-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-13
      • 1970-01-01
      • 2011-03-17
      • 1970-01-01
      相关资源
      最近更新 更多