gpt4 book ai didi

python - 描述符和 python 提供的属性

转载 作者:太空狗 更新时间:2023-10-30 01:35:03 25 4
gpt4 key购买 nike

我正在学习 Python,我正在尝试更好地理解描述符。当我看这本 Python 在线书籍时:http://www.cafepy.com/article/python_attributes_and_methods/ch01s05.html ,它说:

  1. 如果 attrname 是 objectname 的特殊(即 Python 提供的)属性,则返回它。

我不明白 Python 提供的是什么意思。有人可以给我一个优先于通常的解析顺序的 Python 提供的属性的示例吗?

注意:我只对新式类感兴趣(据我所知,描述符甚至不适用于旧式类)。

最佳答案

__class__,例如:

>>> class Test(object):
__dict__ = {'__class__' : "dict of Test"}
def __init__(self):
self.__dict__['__class__'] = "dict of test"


>>> test = Test()
>>> test.__class__
<class '__main__.Test'>
>>> test.__dict__
{'__class__': 'dict of test'}
>>> Test.__dict__
dict_proxy({'__dict__': {'__class__': 'dict of test'}, '__module__': '__main__', '__weakref__': <attribute '__weakref__' of 'Test' objects>, '__doc__': None, '__init__': <function __init__ at 0x02BD2770>})
>>>

旧式类中的等价物:

>>> class Test:
pass

>>> Test.__dict__["__class__"] = "spam"
>>> test = Test()
>>> test.__class__
<class __main__.Test at 0x02BD1110>
>>> test.__dict__ = {'__class__': "foo"}
>>> test.__class__
<class __main__.Test at 0x02BD1110>

同时

>>> test.__dict__ = {'__lolcat__': "bar"}
>>> test.__lolcat__
'bar'

根据对象的类型,还有很多特殊的属性名称。例如,函数:

>>> def test():pass

>>> dir(test)
['__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__doc__', '__format__', '__get__', '__getattribute__', '__globals__', '__hash__', '__init__', '__module__', '__name__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'func_closure', 'func_code', 'func_defaults', 'func_dict', 'func_doc', 'func_globals', 'func_name']
>>> test.func_closure
>>> test.__dict__['func_closure']='roflcopter'
>>> test.func_closure
>>> test.__dict__['foo']='bar'
>>> test.foo
'bar'

参见 http://docs.python.org/reference/datamodel.html概览

关于python - 描述符和 python 提供的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10536539/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com