我有一个类似的课程:
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
,则C._use_obj
如果在C.this
this
,则C
如果obj.this
this
,则C
醇>
this
可以是属性(类或实例),属性或方法。而且我不知道myobj
之前是什么。在没有规则1的情况下,我认为我可以使用__getattr__
来完成。但是对于规则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)