[英]Python class with default attribute factory
我想创建一个 python class ,它在访问不存在的属性时执行某个方法。 最终目标是创建一个 object 来从文件系统中加载尚未加载的属性。
我目前的想法是用defaultdict
替换__dict__
属性,并用访问__dict__
属性的方法覆盖__getattr__
方法。 这看起来像这样:
class MyClass():
def __init__(self):
self.__dict__ = defaultdict(lambda: "Now we would load and return the object...",
self.__dict__)
self.attribute = "An attribute"
def __getattr__(self, *args, **kwargs):
return self.__dict__.__getitem__(*args, **kwargs)
所需的行为如下:
>>> a = MyClass()
>>> a.attribute
'An attribute'
>>> a.non_existent_attribute
'Now we would load and return the object...'
据我所知,这是可行的。 我现在想知道这个过程的隐藏成本是什么,以及是否有更优雅的方式来实现它。
__getattr__
会对计算性能产生重大影响?一个更简单的定义,不需要更改self.__dict__
的值:
class MyClass():
def _load_attribute(self, name):
"""Load value for attribute <name> from disk"""
def __getattr__(self, name):
value = self._load_attribute(name)
setattr(self, name, value)
return value
m = MyClass()
print(m.foo) # Calls m._load_attribute("foo") from m.__getattr_ to set m.foo
print(m.foo) # Accesses m.foo directly, without calling m.__getattr__
__getattr__
仅对通过正常查找算法找不到的属性调用; 一旦setattr
被调用,属性就会被正常找到,所以__getattr__
每个属性只会被调用一次。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.