使用__getattr__为特定类型调用子方法?

时间:2014-08-23 17:28:14

标签: python python-2.7 recursion getattr

我有一个班级,他们的字段是另一个班级的实例。

class Field:
    def get(self):
    def set(self, value):
    def delete(self):

class Document:
    def __init__(self):
        self.y = Field()
        self.z = True

我希望能够做的是当父项的实例引用其属性时,而不是它调用孩子的方法。

d = Document()
d.y = 'some value'  # Calls the `set` function of the Field
d.y == 'some value'  # Calls the `get` function of the Field
del d.y  # Calls the `delete` function of the Field

另一个问题是,当字段属于Field类型时,我只想要这种行为。

我遇到递归问题尝试使用__getattr__之类的内容,如下所示:

def __getattr__(self, key):
    if isinstance(getattr(self, key), Field):
        return getattr(self, key).get()
    return getattr(self, key)

递归是相当明显的,为什么它会发生......但我该如何避免呢?

我已经在StackOverflow上看到了一些示例,但我似乎无法弄清楚如何绕过它。

1 个答案:

答案 0 :(得分:1)

您所描述的内容或多或少完全是Python使用Descriptor协议访问类的属性的无效方式 -

只需让您的字段类具有[{3}}中所述的__get____set____delete__方法 - 并确保所有类都有object作为基类,否则它们继承旧样式类,出于兼容性原因仅存在于Python 2中,并且自Python 2.2以来不推荐使用(并完全忽略描述符协议) )