getattr和getattr之间是什么关系?

2024-04-28 19:28:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道这个密码是对的:

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')()   

这是错误的:

# will __getattr__ affect the getattr?

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

print getattr(a)

这也是错误的:

a={'aa':'aaaa'}
print getattr(a,'aa')

我们应该在哪里使用__getattr__getattr


Tags: theselfdefault密码objectinitdef错误
3条回答

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

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

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

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

因此,您的第二个示例是错误的,因为内置的getattr不能用单个参数调用。

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

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

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

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

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__()在每次查找时都会调用它。这是非常危险的,因为它可能使它无法正常访问成员。

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!

亚历克斯的回答很好,但在你要求的时候给了你一个示例代码:)

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__定义如何处理未找到的属性

以及

getattr获取属性

相关问题 更多 >