我偶然发现__getattr__
内置,并想知道什么时候会使用它。我很难从文档
http://docs.python.org/reference/datamodel.html#考虑实际使用。什么是它如何在代码中使用和使用的实际例子?何时使用__getattr__
1
A
回答
6
一个例子是使用对象符号使用词典。例如,考虑一个字典
myDict = {'value': 1}
通常在Python一个访问“值”变量作为
myDict['value']
这将在Python解释打印1
。但是,有人可能希望使用myDict.value
表示法。这可以通过使用下面的类来实现:
class DictAsMember(dict):
def __getattr__(self, name):
value = self[name]
if isinstance(value, dict):
value = DictAsMember(value)
return value
my_dict = DictAsMember()
my_dict['property'] = {'sub_property': 1}
print(my_dict.property.sub_property) # 1 will be printed
3
一个示例用法是为某个对象创建一个简单的包装。例如,为了记录调用,或者修改它的行为而不从它继承,并且不必实现对象的整个接口。
这里有几个很好的记录例子,例如,http://western-skies.blogspot.fr/2008/02/complete-example-of-getattr-in-python.html。
3
我需要为使用承载令牌的REST客户端执行此操作。我将Requests的Session对象封装到我自己的接口中,这样我就可以始终发送auth头文件,并且(更相关地)使用URL的路径将HTTP请求发送到同一个站点。
class requests_wrapper():
client = requests.session(headers={'Authorization':'myauthtoken'})
base_path = "http://www.example.com"
def _make_path_request(self, http_method, path, **kwargs):
"""
Use the http_method string to find the requests.Session instance's
method.
"""
method_to_call = getattr(self.client, http_method.lower())
return method_to_call(self.base_path + path, **kwargs)
def path_get(self, path, **kwargs):
"""
Sends a GET request to base_path + path.
"""
return self._make_path_request('get', path, **kwargs)
def path_post(self, path, **kwargs):
"""
Sends a POST request to base_path + path.
"""
return self._make_path_request('post', path, **kwargs)
def path_put(self, path, **kwargs):
"""
Sends a PUT request to base_path + path.
"""
return self._make_path_request('put', path, **kwargs)
def path_delete(self, path, **kwargs):
"""
Sends a DELETE request to base_path + path.
"""
return self._make_path_request('delete', path, **kwargs)
于是,我只能根据道路上的一个要求:
# Initialize
myclient = requests_wrapper()
# Make a get request to http://www.example.com/api/spam/eggs
response = myclient.path_get("/api/spam/eggs")
# Print the response JSON data
if response.ok:
print response.json
3
由于__getattr__
是only called when an attribute is not found,它可以定义一个替代的地方去寻找一个属性,或者,得到的默认值,类似于defaultdict
的有用方式。
您也可以通过将对象的MRO中的所有查找委托给另一个对象来模拟基类高于其他对象的所有其他对象(尽管这样做可能会导致无限循环,如果另一个对象正在将该属性委托回)。
还有__getattribute__
,这是相关的,因为它随时调用任何属性在对象上查找。
相关问题
- 1. 使用__getattr__进行授权
- 2. __getattr__在蟒蛇
- 3. __getattr__在python
- 4. python __getattr__ and __name__
- 5. 为什么pickle.dumps调用__getattr__?
- 6. 如何使用__getattr__访问调用参数和参数
- 7. __getattr__错误,同时调用foreach中的数据帧在pyspark
- 8. 元类的__getattr__未被调用
- 9. 为什么__getattr__函数不起作用?
- 10. Python像__getattr__ for Ruby/JRuby
- 11. python:in __getattr__ raise AttributeError,attr AttributeError:__len__
- 12. IronPython覆盖__setattr__和__getattr__
- 13. Python函数__setattr__和__getattr__
- 14. Python继承和__getattr__&__getattribute__
- 15. 使用__getattr__实现装饰器设计模式
- 16. 防止被称为如果不正确使用__getattr__
- 17. 在Python中使用__getattr__来更新属性?
- 18. 为什么我不能在Django模型中使用__getattr__?
- 19. 使用__getattr__和会议期望的行为的子类
- 20. 如何使用Python控制台查看实现__getattr__的类的内部?
- 21. 尝试在__getattr__中返回默认值时,Python pickle崩溃了
- 22. 当访问全局变量时,模块的__setattr__和__getattr__
- 23. python:有选择地覆盖__getattr__
- 24. Python:为什么__getattr__捕获AttributeErrors?
- 25. 在实例化期间更改__getattr__
- 26. python中很奇怪的__getattr__行为
- 27. Python深度定制__getattr__和__setattr__
- 28. 的Python __getattribute__(或__getattr__)来模拟PHP __call
- 29. python中的模块中的__getattr__
- 30. __getattr__和getattr之间有什么关系?
应该是'value = self [name]'? – Darthfett
@Darthfett是的,感谢您发现 - 我已更正示例代码。 – Chris