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>