我想定义一个包含read
和write
方法的类,可以按如下方式调用该类:
instance.read
instance.write
instance.device.read
instance.device.write
为了不使用隔行扫描类,我的想法是覆盖__getattr__
和__setattr__
方法并检查给定名称是否device
将return重定向到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__
,依此类推。我怎么需要更改此代码,即,在这种情况下,一个新的属性x
的self
创建,持有的价值1
?
还是有更好的方法来处理instance.device.read
“映射”到的呼叫instance.read
?
总是有关于为什么的问题:我需要创建xmlrpc
调用的抽象,可以为它们创建非常简单的方法(例如myxmlrpc.instance,device.read
,like)。我需要对此进行“模拟”以模仿此类多点方法调用。
您必须调用父类__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
问题内容: 我有这样的代码: 实例化B可以按预期工作,但是实例化C无限递归并导致堆栈溢出。我该如何解决? 问题答案: 实例化C调用时,仍然是C,因此super()调用将其带回B。 调用super()时,请直接使用类名。因此,在B中,请致电,而不是(最好在C中使用)。在Python 3中,您可以仅使用不带参数的super()来实现同一目的
我有以下代码。 HTML
我读了很多关于如何避免Android内存泄漏的文章,但我仍然不太确定我是否做对了。 我的应用程序由一个活动组成 问题1:这够了吗? 让我困惑的是,你可以在网上找到一个经典的“不去”的例子(http://www.curious-creature.org/2008/12/18/avoid-memory-leaks-on-android/): 我认为,一旦创建完成, 检索上下文,将其传递给手动创建的查看
问题内容: 我正在编写一个函数,该函数最多可以调用5000次。当然,我得到了。有什么办法可以以一种非常简单的方式重写此代码?: 顺便说一下,我们可以调用这些函数的深度有什么限制? 问题答案: 使用显式的对象堆栈和循环,而不是调用堆栈和递归:
问题内容: 我在Stack Exchange上的一个问题中看到,限制可能是每15分钟的请求数的函数,并且还取决于算法的复杂性,只不过这并不复杂。 所以我使用这段代码: 我总是收到Twitter限制错误: 问题答案: 问题在于您的区块放置在错误的位置。将数据插入数据库将永远不会产生-对其进行迭代。我建议重构您的代码以在无限循环中调用方法。该调用应放置在块中,因为它可能引发错误。 代码大致如下所示:
问题内容: 这看起来很丑。可选选项的优点在这里完全消失了。我读到应该使用或代替。但是,如果我更换每个吸气剂,真的有好处吗? 与 您知道这里的一些常见或最佳做法吗? 问题答案: 您可以使用 关键是仅在可选函数不为空时才评估映射函数,否则结果将保留为空。如果可选为空,将返回。