相关疑难解决方法(0)

像属性一样访问dict键?

我发现访问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密钥有什么警告和陷阱?

python syntax dictionary

273
推荐指数
16
解决办法
16万
查看次数

如何正确使用__setattr__,避免无限递归

我想定义一个包含readwrite方法的类,可以按如下方式调用:

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__,依此类推.我怎么需要更改此代码,即,在这种情况下,一个新的属性xself创建,持有的价值1

或者有没有更好的方法来处理像instance.device.read'映射'的调用instance.read

因为总是存在关于原因的问题:我需要创建xmlrpc调用的抽象,为此myxmlrpc.instance,device.read可以创建非常简单的类似方法.我需要'模拟'这样来模仿这样的多点方法调用.

python setattr getattr python-2.7

47
推荐指数
3
解决办法
4万
查看次数

标签 统计

python ×2

dictionary ×1

getattr ×1

python-2.7 ×1

setattr ×1

syntax ×1