测试描述符是否已被解包的有效方法是什么?

时间:2018-05-02 04:04:02

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

假设我们有以下类:

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类,只有cm返回的geht

random.choice是高度设计的,但有些情况下我们有一个伪属性的容器,我们想要验证它们是否还没有被解包,或者验证它们已被解包

一种失败的方法

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

但是,使用__get__修饰的函数的@classmethod方法会返回一个也具有__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__方法。但是,我希望解决方案一般适用于描述符,而不仅仅是classmethod。对于具有d方法的类的任何属性__get__,最好确定某个引用ref是对d的引用还是d.__get__()返回的值。 {1}}(假设d.__get__()未返回d

1 个答案:

答案 0 :(得分:0)

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