Skip to main content
 首页 » 编程设计

python之在 Python 中使用 __setattr__ 进行属性别名

2025年05月04日16kevingrace

我有一个 Python 类,它有各种我想公开为 x、y 的内部变量,一个简单的例子是:

class Vec2: 
    def __init__(self): 
        self.data = [0.0, 0.0] 
        self.mapping = {'x':0, 'y':1} 
 
    def __getitem__(self, index): 
        return self.data[index] 
 
    def __setitem__(self, index, value): 
        self.data[index] = value 
 
    def __getattr__(self, key): 
        if key in self.mapping: 
            return self.data[self.mapping[key]] 
        else: 
            raise AttributeError 
 
    def _setattr__(self, key, value): 
        # ????? 
        pass 

我原以为这行不通,因为 __getattr__ 访问了 self 的成员。但是,只要我不尝试定义 __setattr__,一切都会正常进行 - 即使我只是让它等于 pass,我也会得到递归。我应该如何实现 __setattr__?特别是,如果它们的键不是 x 或 y,我应该怎么调用?

此外,一般来说,我的问题是这是否是实现所需行为的正确方法,例如:

v = Vec2() 
# this 
v.x = 1.0 
v.y = 0.0 
# or this 
v[0] = 1.0 
v[1] = 0.0 

或者是否有更好的选择。我正在使用 python 2.7.5。谢谢!

请您参考如下方法:

您可以显式调用 object.__setattr__ 来避免递归:

def __setattr__(self, key, value): 
    object.__setattr__(self, key, value)