小能豆

如何以编程方式设置属性?

javascript

假设我有一个 python 对象x和一个字符串s,如何设置属性sx那么:

>>> x = SomeObject()
>>> attr = 'myAttr'
>>> # magic goes here
>>> x.myAttr
'magic'

有什么魔力呢?顺便说一下,这样做的目的是缓存对 的调用x.__getattr__()


阅读 41

收藏
2024-07-02

共1个答案

小能豆

要使用字符串作为属性名称来动态设置对象的属性,可以使用 Python 中的内置函数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'

如果您的目标是缓存对 的调用x.__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__方法被重写,以确保设置属性会直接更新缓存。

2024-07-02