Python:正确分配测试描述符

Python:正确分配测试描述符,python,descriptor,Python,Descriptor,考虑到这个例子: >>> class Bar(object): ... ... def __init__(self, name): ... self.name = name ... def __set__(self, instance, value): ... setattr(instance, self.name, value) ... def __get__(self, instance, owner): .

考虑到这个例子:

>>> class Bar(object):
...     
...     def __init__(self, name):
...         self.name = name
...     def __set__(self, instance, value):
...         setattr(instance, self.name, value)
...     def __get__(self, instance, owner):
...         return getattr(instance, self.name, owner)
...     
>>> class Foo(object):
...     bat = Bar('bat')
...     
>>> Foo.bat
<class 'Foo'>
>>> type(Foo.bat)
<class 'type'>  # how would you get <class 'Bar'> ?
类栏(对象): ... ... 定义初始化(self,name): ... self.name=名称 ... 定义集(自身、实例、值): ... setattr(实例、self.name、值) ... 定义获取(自身、实例、所有者): ... 返回getattr(实例、self.name、所有者) ... >>>类Foo(对象): ... bat=Bar(‘bat’) ... >>>食蝠 >>>类型(Foo.bat) #你会怎么得到? 我想编写一些
pytests
,断言正确的描述符已分配给正确的属性


但是我似乎无法在描述符被分配后检查它的类型。你可以用
vars(Foo)['bat']

覆盖通常的查找(它使用你试图看到的描述符,不管你是否在结果中调用
type
),我不确定你想用描述符做什么,但通常,当实例未传递时,您希望传回描述符本身:

class Bar(object):
    def __init__(self, name):
        self.name = name
    def __set__(self, obj, value):
        setattr(obj, self.name, value)
    def __get__(self, obj, cls):
        if obj is None:
            return self
        return getattr(obj, self.name)

class Foo(object):
    bat = Bar('bat')

Foo.bat
# <__main__.Bar at 0x7f202accbf50>
类栏(对象):
定义初始化(self,name):
self.name=名称
定义设置(自身、对象、值):
setattr(对象、self.name、值)
定义获取(自身、obj、cls):
如果obj为无:
回归自我
返回getattr(对象,self.name)
类Foo(对象):
bat=Bar(‘bat’)
食蝠
# 

为什么
foo.bat
不会导致堆栈溢出错误?@madphestics:
foo.bat
None
作为
实例传递到
\u get\u
。很好!谢谢,这真让我难堪。您的简单解释使我们有理由只执行一些类型/域检查。也许我做的不够。。。但这是有道理的。您可能希望在执行
Foo().bat
时保持警惕。未经测试,但我怀疑它将触发编写的无限递归。