我知道这个密码是对的:
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
?
getattr
是一个内置函数,至少有两个参数:从中获取属性的对象和属性的字符串名。如果字符串名是常量,比如
'foo'
,getattr(obj, 'foo')
与obj.foo
完全相同。因此,内置函数
getattr
的主要用例是,当属性名不是常量,而是变量时。第二个重要的用例是当您传递三个参数,而不是两个:在这种情况下,如果属性不在对象中,getattr
返回第三个“default”参数,而不是引发异常。__getattr__
是在类中定义的一种特殊方法,当请求该类实例的某个属性时调用该方法,而其他提供该属性的常规方法(通过实例的__dict__
、插槽、属性等)全部失败。例如,当您希望将未定义的属性查找委托给其他对象时,可以定义它。因此,您的第二个示例是错误的,因为内置的
getattr
不能用单个参数调用。第三个失败是因为试图从中“获取属性”的字典没有该属性——它有项,当然这些项与属性完全不相交。
__getattr__()
是可以定义的特殊方法函数。当成员查找失败时,将调用此函数。getattr()
是一个可以调用以尝试成员查找的函数。如果查找成功,则获取成员(可能是方法函数对象,也可能是数据属性对象)。getattr()
在查找失败的情况下也可以返回默认值。如果您声明一个
__getattr__()
成员函数,您可以使它有时成功,也可以使它每次成功。Python还有一个
__getattribute__()
在每次查找时都会调用它。这是非常危险的,因为它可能使它无法正常访问成员。哎呀,现在不可能访问a.v!
亚历克斯的回答很好,但在你要求的时候给了你一个示例代码:)
简言之,答案是
你用
__getattr__
到定义如何处理未找到的属性以及
getattr
到获取属性相关问题 更多 >
编程相关推荐