我想知道是否有可能创建一个将属性作为参数的类函数(不确定如何命名)
示例:
class CrestAPI(object):
def __init__(self):
self.base_url = 'https://public-crest.eveonline.com/'
self.urls = get_json(self.base_url)
def __getattr__(self, key):
try:
getattr(self, key)
except AttributeError:
print key
api = CrestAPI()
api.market.types
其中api.market.types应该打印类似[' market',' types']的内容 所以当属性不存在时,我可以用这些参数运行一些函数
答案 0 :(得分:1)
这有点棘手。
在您的示例中,Python将尝试检索属性' market'来自object' api'首先,然后检索属性'类型'从第一步收到的任何东西。所以基本上你需要一个迭代的解决方案。
然而,对于迭代解决方案,关键问题是何时停止。在你的例子中没有任何东西可以告诉代码"是的,解析在这里停止"。
然而,语法略有不同,例如:
api = CrestAPI()
parsed_url = api.market.types()
在这种情况下,Python将检索' market'来自' api',然后检索'类型'从结果,然后尝试将其作为一个函数调用。这使我们能够打破递归并实际返回结果。
快速而肮脏的解决方案可能如下所示:
class RecursiveRetrievalHelper(object):
__items = None
def __init__(self, first_item):
self.__items = [first_item]
def __getattr__(self, item):
self.__items.append(item)
return self
# One possible way to break the iteration
def __call__(self, *args, **kwargs):
return self.__items
# Another possible way to break the iteration
def __iter__(self):
return iter(self.__items)
# This is mostly for debugging and console
def __repr__(self):
return repr(self.__items)
class MainClass(object):
def __getattr__(self, item):
return RecursiveRetrievalHelper(item)
if __name__ == '__main__':
this_api = MainClass()
print this_api.has.some.weird.complicated.path() # Uses __call__()
print list(this_api.has.some.weird.complicated.path) # Uses __iter__()
for url_part in this_api.has.some.weird.complicated.path: # Uses __iter__() again
print url_part,
print
脚本输出:
['has', 'some', 'weird', 'complicated', 'path']
['has', 'some', 'weird', 'complicated', 'path']
has some weird complicated path
如果您需要更高级的功能,则可以扩展帮助程序类,因为在当前状态下它只能返回一个键列表。