Python 确定类属性是否为属性?

Python 确定类属性是否为属性?,python,descriptor,Python,Descriptor,是否有方法确定类属性是否为属性(使用\uuuu get\uuuu和\uu set\uuuu? 中的方法 看起来只适用于属性装饰器,在我的情况下不适用 class Property(object): _value = None def __get__(self, instance, owner): return self._value def __set__(self, instance, value): self._value = val

是否有方法确定类属性是否为
属性(使用
\uuuu get\uuuu
\uu set\uuuu
? 中的方法 看起来只适用于
属性
装饰器,在我的情况下不适用

class Property(object):
    _value = None
    def __get__(self, instance, owner):
        return self._value 
    def __set__(self, instance, value):
        self._value = value * 2


class A(object):
    b = Property()

>>> a = A()
>>> type(A.p)
<type 'NoneType'>
>>> type(a.p)
<type 'NoneType'>
类属性(对象):
_值=无
定义获取(自身、实例、所有者):
返回自我值
定义集(自身、实例、值):
自身价值=价值*2
A类(对象):
b=属性()
>>>a=a()
>>>类型(A.p)
>>>类型(a.p)

描述符返回
None
,因为它也被类调用(当为该场景调用
\uu get\uuu
时,
实例
属性设置为
None

您需要在不调用描述符协议的情况下检索它,进入class
\uuu dict\uu
属性是最直接的路径:

A.__dict__['p']
有关如何以及何时调用描述符的更多详细信息,请参阅

或者,当
实例
设置为
时,按照
属性
对象所做的操作并返回
self
(在类上访问时也是如此):

也看到

演示:

类属性(对象): …定义获取(自身、实例、所有者): …返回自我值 …定义集(自身、实例、值): …自身值=值*2 ... >>>A类(对象): …b=属性() ... >>>A.uuu dict_uuuuuu['b'] >>>类型(A._udict__['b'])) >>>类属性(对象): …_值=无 …定义获取(自身、实例、所有者): …如果实例为“无”: …回归自我 …返回自我值 …定义集(自身、实例、值): …自身值=值*2 ... >>>A类(对象): …b=属性() ... >>>A.b
正确的术语是“描述符”。请参阅精彩的解释,参考文章非常有用!!
class Property(object):
    _value = None
    def __get__(self, instance, owner):
        if instance is None:
            return self
        return self._value 
    def __set__(self, instance, value):
        self._value = value * 2
>>> class Property(object):
...     def __get__(self, instance, owner):
...         return self._value 
...     def __set__(self, instance, value):
...         self._value = value * 2
... 
>>> class A(object):
...     b = Property()
... 
>>> A.__dict__['b']
<__main__.Property object at 0x103097910>
>>> type(A.__dict__['b'])
<class '__main__.Property'>
>>> class Property(object):
...     _value = None
...     def __get__(self, instance, owner):
...         if instance is None:
...             return self
...         return self._value 
...     def __set__(self, instance, value):
...         self._value = value * 2
... 
>>> class A(object):
...     b = Property()
... 
>>> A.b
<__main__.Property object at 0x10413d810>