我一直致力于开发一个测试框架(在Selenium和其他工具集之上,虽然这并不是特别相关),我决定的其中一个组件可以让扩展框架变得更容易添加自动记忆的类成员(例如,从页面对象中的页面中提取的数据元素)的方法。我提出的解决方案是一个覆盖__getattr__()
的类,它可以用作需要自动memoize的每个类的父类。该类的代码如下:
class SelfCachingGetters(object):
def __getattr__(self, name):
getter_string = '_get_%s' % name
try:
value = getattr(self, getter_string)()
setattr(self, name, value)
except AttributeError:
raise AttributeError('%s is not a member of this class.' % name)
return value
这个类使得在任何子类中创建自动记忆成员所需要做的就是声明一个方法_get_XXXX()
,其中XXXX是您希望类成员拥有的名称。我喜欢这个,因为它实现了一种简单而干净的方式来实现这个功能,例如,每个页面对象都没有装饰器的数十种方法。
我的问题是,这是实现此行为的最佳(最Pythonic)方式吗?关于它的一些事情对我来说似乎非常不合适。我正在寻找元类和类装饰器。有没有人有任何其他建议?