假设我有一个 python 对象x和一个字符串s,如何设置属性s?x那么:
x
s
>>> x = SomeObject() >>> attr = 'myAttr' >>> # magic goes here >>> x.myAttr 'magic'
有什么魔力呢?顺便说一下,这样做的目的是缓存对 的调用x.__getattr__()。
x.__getattr__()
要使用字符串作为属性名称来动态设置对象的属性,可以使用 Python 中的内置函数setattr。操作方法如下:
setattr
class SomeObject: pass x = SomeObject() attr = 'myAttr' value = 'magic' setattr(x, attr, value) print(x.myAttr) # Output: magic
在此示例中,将对象上的setattr(x, attr, value)属性设置为值。您可以将其替换为要分配给该属性的任何值。myAttr``x``'magic'``'magic'
setattr(x, attr, value)
myAttr``x``'magic'``'magic'
如果您的目标是缓存对 的调用x.__getattr__(),您可能需要__getattr__在类中创建一个自定义方法来缓存属性查找的结果。以下是示例:
__getattr__
class SomeObject: def __init__(self): self._cache = {} def __getattr__(self, name): if name in self._cache: return self._cache[name] # Simulate the computation of the attribute value value = 'computed_value_for_' + name self._cache[name] = value return value def __setattr__(self, name, value): if name in ('_cache',): # Allow setting _cache in __init__ super().__setattr__(name, value) else: self._cache[name] = value # Example usage x = SomeObject() print(x.myAttr) # Outputs: computed_value_for_myAttr print(x.myAttr) # Outputs: computed_value_for_myAttr (cached value)
在此示例中,__getattr__如果属性值尚未缓存,则计算该属性值,将其存储在 中_cache,并在后续访问时返回缓存值。该__setattr__方法被重写,以确保设置属性会直接更新缓存。
_cache
__setattr__