栏目分类:
子分类:
返回
文库吧用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
文库吧 > IT > 面试经验 > 面试问答

我可以获取对Python属性的引用吗?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

我可以获取对Python属性的引用吗?

get_dict_attr
(下图)
attr
在给定对象的中查找
__dict__
,如果存在则返回关联的值。如果
attr
不是其中的关键,则搜索
__dict__
对象的MRO
__dict__
。如果找不到密钥,
AttributeError
则引发。

def get_dict_attr(obj, attr):    for obj in [obj] + obj.__class__.mro():        if attr in obj.__dict__: return obj.__dict__[attr]    raise AttributeError

例如,

class Foo(object):    x=1    def bar(self):        pass    @property    def baz(self):        return 0foo=Foo()print(get_dict_attr(foo,'x'))# 1print(get_dict_attr(foo,'bar'))# <unbound method Foo.bar>print(get_dict_attr(foo,'baz'))# <property object at 0xb77c0dc4>print(get_dict_attr(foo,'y'))# AttributeError

请注意,这与属性查找的常规规则有很大不同。一方面,中的数据描述符

obj.__class__.__dict__
(带有
__get__
__set__
方法的描述符)通常优先于中的值
obj.__dict__
。在中
get_dict_attr
obj.__dict__
具有优先权。

get_dict_attr
不尝试致电
__getattr__

最后,

get_dict_attr
仅适用于
obj
作为新样式类实例的对象。

不过,我希望这会有所帮助。


class Foo(object):    @property    def bar(self):        return 0f = Foo()

这引用了属性

bar

print(Foo.bar)# <property object at 0xb76d1d9c>

您看到的

bar
是关键
Foo.__dict__

print(Foo.__dict__['bar'])# <property object at 0xb775dbbc>

所有属性都是描述符,这意味着它具有

__get__
方法:

print(Foo.bar.__get__)# <method-wrapper '__get__' of property object at 0xb76d7d74>

您可以通过传递object

f
f
as的类来调用方法:

print(Foo.bar.__get__(f,Foo))# 0

我喜欢下图。垂直线显示对象与对象的类之间的关系。

在这种情况下:

   Foo          B   | Foo.__dict__={'bar':b}| B.__dict__={'__get__':...}   ||         f `--------> b

f.bar
使
b.__get__(f,Foo)
被调用。

这将在此处详细说明。



转载请注明:文章转载自 www.wk8.com.cn
本文地址:https://www.wk8.com.cn/it/640136.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 wk8.com.cn

ICP备案号:晋ICP备2021003244-6号