gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 20:35:29 27 4
gpt4 key购买 nike

我想定义一个包含readwrite方法的类,可以这样调用:

instance.read
instance.write
instance.device.read
instance.device.write

为了不使用交错类,我的想法是覆盖 __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)

__init__ 中,代码试图创建一个新属性 x,它调用 __setattr__,它再次调用 __setattr__ 等等。我需要如何更改此代码,在这种情况下,创建 self 的新属性 x,并保存值 1

或者有没有更好的方法来处理像 instance.device.read 这样被“映射”到 instance.read 的调用?

因为总是有关于为什么的问题:我需要创建 xmlrpc 调用的抽象,为此非常简单的方法,如 myxmlrpc.instance,device.read 和类似的可以创建。我需要“模拟”它以模仿这种多点方法调用。

最佳答案

必须调用父类的__setattr__方法:

class MyTest(object):

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

def __setattr__(self, name, value):
if name=="device":
print "device test"
else:
super(MyTest, self).__setattr__(name, value)
# in python3+ you can omit the arguments to super:
#super().__setattr__(name, value)

关于最佳实践,因为您打算通过 xml-rpc 使用它,我认为这可能在 _dispatch 内完成更好。方法。

一种快速而肮脏的方法是简单地做:

class My(object):
def __init__(self):
self.device = self

关于python - 如何正确使用__setattr__,避免无限递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17020115/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com