如果要动态创建和引用嵌套属性,最好的方法是什么?
我正在编写一个简单的 Flickr 客户端,并希望尽可能地匹配记录在案的 API,而无需实际定义每个方法。例如,向 Flickr 的flickr.people.getInfo
API 方法发出请求:
flickr = Client()
data = flickr.people.getInfo(user_id='xxx')
在这种情况下flickr.people.getInfo
,直接映射到其 API 文档中的相应方法。当调用people
并getInfo
在查找时创建它们时,发出的正确请求由 的路径决定getInfo
,即people.getInfo
. 这是我使用的方法:
class Attr(object):
def __init__(self, client, name, parent):
self._client = client
self._name = name
self._parent = parent
def __getattr__(self, name):
attr = Attr(self._client, name, self)
setattr(self, name, attr)
return attr
def _get_path(self, path=None):
if path:
path = '.'.join((self._name, path))
else:
path = self._name
if isinstance(self._parent, Attr):
return self._parent._get_path(path)
return path
def __call__(self, *args, **kwargs):
return self._client.execute_method(self._get_path(), *args, **kwargs)
class Client(object):
def __getattr__(self, name):
attr = Attr(self, name, None)
setattr(self, name, attr)
return attr
def execute_method(self, method, *args, **kwargs):
print method, args, kwargs
这行得通,但我很好奇我处理嵌套属性分配/查找的方法是否可以改进,或者是否有任何错误潜伏在等待中,我不知道。特别是,我很好奇是否有更好的方法来找出给定属性的“路径”。例如,如果我调用Client().x.y.z()
, x
, y
,z
不存在,并且会被一个一个地创建(因为一次__getattr__
查找一个属性)。到时间z
被调用时,我需要能够辨别到的路径z
是x.y.z
。