我发现访问dict密钥更加方便,obj.foo而不是obj['foo'],所以我写了这个代码片段:
class AttributeDict(dict):
def __getattr__(self, attr):
return self[attr]
def __setattr__(self, attr, value):
self[attr] = value
Run Code Online (Sandbox Code Playgroud)
但是,我认为必须有一些原因,Python不提供开箱即用的功能.以这种方式访问dict密钥有什么警告和陷阱?
我想定义一个包含read和write方法的类,可以按如下方式调用:
instance.read
instance.write
instance.device.read
instance.device.write
Run Code Online (Sandbox Code Playgroud)
为了不使用隔行扫描类,我的想法是覆盖__getattr__和__setattr__方法并检查,如果给定的名称是device将返回重定向到self.但是我遇到了一个无限递归的问题.示例代码如下:
class MyTest(object):
def __init__(self, x):
self.x = x
def __setattr__(self, name, value):
if name=="device":
print "device test"
else:
setattr(self, name, value)
test = MyTest(1)
Run Code Online (Sandbox Code Playgroud)
如在__init__代码中尝试创建一个新属性x,它会调用__setattr__,再次调用__setattr__,依此类推.我怎么需要更改此代码,即,在这种情况下,一个新的属性x的self创建,持有的价值1?
或者有没有更好的方法来处理像instance.device.read'映射'的调用instance.read?
因为总是存在关于原因的问题:我需要创建xmlrpc调用的抽象,为此myxmlrpc.instance,device.read可以创建非常简单的类似方法.我需要'模拟'这样来模仿这样的多点方法调用.