首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >__getattr__和getattr之间的关系是什么?

__getattr__和getattr之间的关系是什么?
EN

Stack Overflow用户
提问于 2009-12-22 15:04:19
回答 3查看 14.5K关注 0票数 37

我知道这段代码是正确的:

代码语言:javascript
复制
class A:   
    def __init__(self):
        self.a = 'a'  
    def method(self):   
        print "method print"  

a = A()   
print getattr(a, 'a', 'default')   
print getattr(a, 'b', 'default')  
print getattr(a, 'method', 'default') 
getattr(a, 'method', 'default')()   

这是错误的:

代码语言:javascript
复制
# will __getattr__ affect the getattr?

class a(object):
    def __getattr__(self,name):
        return 'xxx'

print getattr(a)

这也是错误的:

代码语言:javascript
复制
a={'aa':'aaaa'}
print getattr(a,'aa')

我们应该在哪里使用__getattr__getattr

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-12-22 15:26:50

Alex的回答很好,但是既然您要求这样做,那么就为您提供一个示例代码:)

代码语言:javascript
复制
class foo:
    def __init__(self):
        self.a = "a"
    def __getattr__(self, attribute):
        return "You asked for %s, but I'm giving you default" % attribute


>>> bar = foo()
>>> bar.a
'a'
>>> bar.b
"You asked for b, but I'm giving you default"
>>> getattr(bar, "a")
'a'
>>> getattr(bar, "b")
"You asked for b, but I'm giving you default"

所以简而言之,答案是

您可以使用

__getattr__ to 定义未找到的属性如何处理

getattr to get attributes

票数 61
EN

Stack Overflow用户

发布于 2009-12-22 15:14:16

getattr是一个内置函数,它(至少)接受两个参数:从中获取属性的对象和属性的字符串名称。

如果字符串名是一个常量,比如'foo',则getattr(obj, 'foo')obj.foo完全相同。

因此,内置函数getattr的主要用例是属性名不是常量,而是变量。第二个重要的用例是当您向它传递三个参数而不是两个参数时:在这种情况下,如果对象中没有该属性,getattr将返回第三个“默认”参数,而不是引发异常。

__getattr__是类中定义的一种特殊方法,当该类的实例的某些属性被请求时会调用该方法,而提供该属性的其他常规方法(通过实例的__dict__、插槽、属性等)都会失败。例如,当您要将其他未定义的属性查找委托给其他对象时,可以对其进行定义。

所以你的第二个例子是错误的,因为内置的getattr不能通过一个参数来调用。

第三个方法失败了,因为您试图从其中“获取属性”的字典没有该属性--它具有,当然,这些项与属性完全不相交。

票数 39
EN

Stack Overflow用户

发布于 2009-12-22 15:28:59

__getattr__()是您可以定义的特殊方法函数。当成员查找失败时,将调用此函数。

getattr()是一个函数,您可以调用它来尝试查找成员。如果查找成功,您将获得成员(可能是方法函数对象,也可能是数据属性对象)。在查找失败的情况下,getattr()也可以返回默认值。

如果您声明了一个__getattr__()成员函数,您可以让它有时成功,也可以让它每次都成功。

代码语言:javascript
复制
class A(object):
    def __getattr__(self, name):
        return "I pretend I have an attribute called '%s'" % name

a = A()

print a.foo # prints "I pretend I have an attribute called 'foo'"

Python还有__getattribute__(),每次查找时都会调用它。这是非常危险的,因为它会导致无法正常访问成员。

代码语言:javascript
复制
class A(object):
    def __init__(self, value):
        self.v = value
    def __getattribute__(self, name):
        return "I pretend I have an attribute called '%s'" % name

a = A(42)

print a.v # prints "I pretend I have an attribute called 'v'"
print a.__dict__["v"] # prints "I pretend I have an attribute called '__dict__'"

糟糕,现在无法访问a.v了!

票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1944625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档