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

我可以获取对Python属性的引用吗?,第1张

我可以获取对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)
被调用。

这将在此处详细说明。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5645939.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存