当前位置: 首页 > 面试题库 >

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

丌官玺
2023-03-14
问题内容

如果我有这个:

class foo(object):
    @property
    def bar(self):
        return 0

f = foo()

如果可能的话,如何在不实际调用方法的情况下获得对f.bar的引用?

编辑添加:我想做的是编写一个对f的成员进行迭代并对其执行某些操作的函数(不重要)。属性让我感到震惊,因为仅在getattr()中命名它们会调用其__get
__()方法。


问题答案:

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 0

foo=Foo()
print(get_dict_attr(foo,'x'))
# 1
print(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_attrobj.__dict__具有优先权。

get_dict_attr不尝试致电__getattr__

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

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

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

f = 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>

您可以通过传递objectffas的类来调用方法:

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

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

在这种情况下:

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

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

这将在此处详细说明。



 类似资料:
  • 问题内容: 我正在使用SSH2。当我尝试通过设置属性时,这是正确的。但是,当我尝试使用获得相同的属性时,我什么也没有。 为什么?他们不一样吗? 当我使用时,我得到了这些: 似乎在休眠状态下进行会话。为什么? 问题答案: 是的,它们是不同的,在scriptlet中,您使用http会话隐式对象;在struts标签属性中,您引用通过OGNL检索的struts会话映射对象。您一无所获,只是因为它们与众不同

  • 问题内容: 我正在尝试做这样的事情: (而不是5,我不想执行两次返回一个数字的函数) 我可以重写它,以便稍后从分配,但是我可以在声明期间立即执行吗? 问题答案: JavaScript中的编号无法像您想象的那样工作。在这种情况下,指的是全局对象。 只有3种情况下会设置该值: 功能案例 这里将引用 全局 对象。 方法案例 在此示例中将参考。 构造案例 关键字前面的函数调用充当构造函数。函数内部将引用一

  • 问题内容: 看看我的“ file.properties”: 为什么当我得到“ key2”的值时,我的结果是“ $ {key1} Martin!”。不像“我叫马丁!” => 我使用Java 6编程=>我使用java.util.Properties 问题答案: 您可能需要查看Apache配置, http://commons.apache.org/configuration/ 它支持的许多功能包括变量插

  • 问题内容: 我正在尝试读取一个自定义(非标准)CSS属性,该属性在样式表(而非内联样式属性)中设置并获取其值。以这个CSS为例: 我已经设法通过IE7中的currentStyle属性获取其值: 但是currentStyle是特定于MS的。所以我在Firefox 3和Safari 3中尝试了getComputedStyle(): …并且返回未定义。 有谁知道跨浏览器的方法来获取自定义CSS属性值?

  • 问题内容: 这个问题很简单,但是由于我是python的新手,所以我从php过来了,因此遇到了一些错误。 我有以下简单的课程: 在PHP中,我可以执行以下操作: 我该如何在python中做到这一点? 问题答案: 要访问对象的字段或方法,请使用dot : 如果将在运行时定义字段名称,请使用内置函数:

  • 本文向大家介绍对比Python中__getattr__和 __getattribute__获取属性的用法,包括了对比Python中__getattr__和 __getattribute__获取属性的用法的使用技巧和注意事项,需要的朋友参考一下 相信大家觉得大多数时候我们并不太需要关注getattribute和getattr的一些细节(至少我自己吧:)), 一般情况下消费我们自定义的类的时候,我们对