2017-09-24 57 views
1

考虑这个例子:的Python:测试描述符分配正确

>>> 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'> ? 

我想写一些pytests是断言正确的描述已被分配给正确的属性。

但我似乎并没有能够检查描述符的类型,一旦被分配

+0

为什么'foo.bat'不会导致StackOverflow错误? –

+0

@MadPhysicist:'Foo.bat'将'None'作为'instance'传递给'__get__'。 –

回答

2

我不知道你想什么你描述的事情,但通常要传回的描述本身当一个实例不过去了:

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> 
+0

只需执行一些类型/域检查。也许我没有足够的RTFM ......但这是有道理的。 –

+0

你可能想要做'Foo()。bat'。未经测试,但我怀疑它会触发写入的无限递归。 –

2

您可以覆盖常用的查询(它使用非常描述你想看到的,是否不是你呼叫type的结果)与vars(Foo)['bat']

+0

不错!谢谢,这真让我难住。你的简单解释很有意义 –