2017-03-08 86 views
1

在这个例子中的代码,我想,以确定是否xTestProperty一个实例:如何确定描述符的类?

class TestProperty(object): 
    def __init__(self, name): 
     self._name = name 

    def __get__(self, instance, cls): 
     return getattr(instance, self._name) 

    def __set_(self, instance, value): 
     setattr(instance, self._name, value) 

class Test(object): 
    x = TestProperty("x") 

print isinstance(Test.x, TestProperty) 

不过,我得到以下异常:

Traceback (most recent call last): 
    File "/home/zenoss/testproperties.py", line 14, in <module> 
    print isinstance(Test.x, TestProperty) 
    File "/home/zenoss/testproperties.py", line 6, in __get__ 
    return getattr(instance, self._name) 
AttributeError: 'NoneType' object has no attribute 'x' 

反正是有说,如果一个属性当它是一个描述符时,它是一个类的实例吗?

回答

2

随着当前__get__Test.x使AttributeError因为当访问使用类的描述符的代码,instance传递None; (=>getattr(None, 'x') =>None.x

您应修改__get__来处理这种情况:

>>> class TestProperty(object): 
...  def __init__(self, name): 
...   self._name = name 
...  def __get__(self, instance, cls): 
...   if instance is None: # To handle access through class, not instance 
...    return self  # returns the TestProperty instance itself. 
...   return getattr(instance, self._name) 
...  def __set_(self, instance, value): 
...   setattr(instance, self._name, value) 
... 
>>> class Test(object): 
...  x = TestProperty("x") 
... 
>>> isinstance(Test.x, TestProperty) 
True 

顺便说一句,你可能知道,随着x = TestProperty("x"),访问x属性通过一个实例会导致另一个异常,因为它会递归地调用__get__( - > getattr(..) - > __get__ - > getattr(..) - > ...),直到堆栈溢出。

+0

谢谢,当'实例是None'时返回'self'会有诀窍。 – Ben

+0

@本,不客气。快乐的Python黑客! – falsetru

0

实现财产的最好方式是与@property装饰:

class TestProperty(object): 

    def __init__(self, name): 
     self._name = name 

    @property 
    def name(self): 
     """Getter for '_name'.""" 
     return self._name 

    @name.setter 
    def name(self, value): 
     """Setter for '_name'.""" 
     self._name = value 

class Test(object): 
    x = TestProperty("x") 

print(isinstance(Test.x, TestProperty)) 

它返回True当我运行它。 请参阅@property的文档https://docs.python.org/3/library/functions.html#property

相关问题