假设DotDict
是一个包装类,它允许您访问包装对象的
__getitem__
方法到__getattr__
假设obj
不是DotDict
的实例,如下所示
关于obj
是真的:
obj.a returns 'apple'
obj[a] returns 999
现在我们将对象包装在DotDict中:
wobj = DotDict(obj)
wobj.a
现在返回与obj[a]
,999相同的值。obj.a
更难获得。你知道吗
class DotDict():
def __init__(self, true_self):
assert (not inspect.isclass(true_self))
object.__setattr__(self, 'true_self', true_self)
def __getattribute__(self, attr_name):
return true_self[attr_name]
一种方法是允许用户在属性名的开头加下划线:
如果_a
也是obj.__getitem__
的有效键,请尝试:
x = wobj.__a
x = wobj.___a
x = wobj.____a
x = wobj._____a
。。。等等。你知道吗
def __getattribute__(self, attr_name):
true_self = object.__getattribute__(self, 'true_self')
try:
return true_self[attr_name]
except KeyError:
# there is a __getitem__ method,
# but attr_name is not a valid key
pass
try:
attr_name = attr_name.lstrip('_')
attr = getattr(true_self, attr_name)
return attr
except AttributeError:
# if "a" is not an attribute of obj, then raise an exception
raise AttributeError
尝试更多下划线不会导致无限循环。
如果___...___a
不是有效键,则会引发异常
到obj.__getitem__
,并且obj
没有名为a
的属性
只有名称不以下划线开头的obj
属性可以通过wobj
访问
这种方法的一个问题是,如果wobj.___a
返回一些东西,我们如何知道我们是得到了obj[___a]
还是obj.a
?
如何区分__getattribute__
返回的结果?你知道吗
class DemoClass:
def __init__(self):
self.a = 'attribute a, not getitem'
self.c = list()
s = 'a'
for k in range(0, 10):
s = '_' + s
self.c.append(s)
def __getitem__(self, key):
print('__getitem__ was called')
if key in self.c:
return '__getitem__' + key
else:
raise KeyError
obj = DemoClass()
ddobj = DotDict(obj)
attr_name = 'a'
try:
count_underscores = 0
while True:
attr = getattr(ddobj, attr_name)
print('potential attr == ', attr)
attr_name = '_' + attr_name
count_underscores += 1
except AttributeError:
print('there is no attribute named ', attr_name.lstrip('_'))
print('count_underscores == ', count_underscores)
print('attr == ', attr)
目前没有回答
相关问题 更多 >
编程相关推荐