繁体   English   中英

Python class 具有默认属性工厂

[英]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__会对计算性能产生重大影响?
  • 是否存在仅在由于属性不存在而引发错误时才跳转的可能实现? (那么当访问现有属性时,object 的行为不会有所不同。)
  • 现在是否会在访问属性时考虑 defaultdict 或者是否有其他方法可以访问我错过的属性? (如果它替换了通常的 object,这个实现会导致错误吗?)
  • 我可能错过了与这种方法相关的风险吗?

一个更简单的定义,不需要更改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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM