如果我有这个:
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_attr
,obj.__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>
您可以通过传递objectf
和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)
被调用。
这将在此处详细说明。
问题内容: 我正在使用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的一些细节(至少我自己吧:)), 一般情况下消费我们自定义的类的时候,我们对