首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >性质型__slots__

性质型__slots__
EN

Stack Overflow用户
提问于 2016-02-04 13:03:52
回答 1查看 1.1K关注 0票数 0

那么,与python property类型有什么关系呢?它既没有__slots__也没有__dict__。但是__dict__ of property类型显示时隙引用。

代码语言:javascript
复制
In [28]: p = property(lambda: 5)

In [29]: hasattr(p, '__slots__')
Out[29]: False

In [30]: hasattr(p, '__dict__')
Out[30]: False

In [31]: type(p).__dict__
Out[31]: 
<dictproxy {'__delete__': <slot wrapper '__delete__' of 'property' objects>,
 '__doc__': <member '__doc__' of 'property' objects>,
 '__get__': <slot wrapper '__get__' of 'property' objects>,
 '__getattribute__': <slot wrapper '__getattribute__' of 'property' objects>,
 '__init__': <slot wrapper '__init__' of 'property' objects>,
 '__new__': <function __new__>,
 '__set__': <slot wrapper '__set__' of 'property' objects>,
 'deleter': <method 'deleter' of 'property' objects>,
 'fdel': <member 'fdel' of 'property' objects>,
 'fget': <member 'fget' of 'property' objects>,
 'fset': <member 'fset' of 'property' objects>,
 'getter': <method 'getter' of 'property' objects>,
 'setter': <method 'setter' of 'property' objects>}>

此外,我还尝试从属性继承来添加附加属性,但显而易见的方法却把事情搞砸了。

代码语言:javascript
复制
In [37]: property_ = type('property_', (property, ), dict(__slots__=('prop', )))

In [38]: p_ = property_(lambda: 5)
---------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-38-06c5a90565ef> in <module>()
----> 1 p_ = property_(lambda: 5)

AttributeError: 'property_' object attribute '__doc__' is read-only

如果property不实现__slots__特性,为什么我不能将属性分配给property实例?

代码语言:javascript
复制
In [45]: p = property(lambda: 'prop')

In [46]: p.attr = 'attr'
--------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-46-71284e3de202> in <module>()
----> 1 p.attr = 'attr'

AttributeError: 'property' object has no attribute 'attr'
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-04 13:07:31

__slots__机制将C类型已经使用的特性公开给Python。slotproperty上的名称中的对象并不意味着它使用了__slots__特性。它们只是使用C类型特性的对象。

property对象可以不使用__slots__而被子类化。

代码语言:javascript
复制
>>> class Foo(property):
...     prop = 'bar'
...
>>> def test(self): return 'success'
...
>>> Foo(test).__get__(object())
'success'
>>> Foo(test).prop
'bar'

子类为该子类的实例添加一个__dict__。或者,您可以简单地通过实现描述符协议轻松地创建相同的功能。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35201764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档