【发布时间】: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