Python调度属性访问嵌入对象

时间:2014-06-10 17:49:00

标签: python properties attributes

我有一个类似的课程:

class C(object):

    _use_obj = 'attr1 attr2'.split()

    def __init__(self, obj):
        self.obj = obj

    # class definition continues here defining a few attributes and methods

我希望能够通过obj以某些规则访问C的属性。

c.this应该返回:

    如果obj.this位于this ,则
  1. C._use_obj 如果在C.this
  2. 中定义了this,则
  3. C 如果obj.this
  4. 中未定义this,则
  5. C

    this可以是属性(类或实例),属性或方法。而且我不知道myobj之前是什么。在没有规则1的情况下,我认为我可以使用__getattr__来完成。但是对于规则1,我不清楚,因为我需要拦截所有属性访问。

1 个答案:

答案 0 :(得分:1)

您可以使用__getattribute__拦截所有属性访问权限,但如果您没有匹配的属性,则需要小心将控制权移交给重写的方法。 所有属性访问都由此方法处理,您需要注意不要以无限递归循环结束:

class C(object):
    _use_obj = 'attr1 attr2'.split()

    def __init__(self, obj):
        self.obj = obj

    def __getattribute__(self, name):
        # setup, make it easier to get attributes we need
        get = super(C, self).__getattribute__
        use_obj = get('_use_obj')
        obj = get('obj')

        if name in use_obj:
            # rule 1, attribute is specifically listed
            return getattr(obj, name)
        try:
            # rule 2, try attribute on self
            return get(name)
        except AttributeError:
            # rule 3, fall back to self.obj
            return getattr(obj, name)