擅长:python、mysql、java
<p>有很多隐藏的陷阱使得这是一个危险的设计,然而这是一个很好的学习例子。在</p>
<p>首先,在装饰时调用“self”失败,因为在该范围内没有self。它只存在于方法内部。既然最简单的那个已经不碍事了。。。在</p>
<p>myfunc是App类的属性。当你创建一个App实例时,总是调用一个函数。只有当这种情况发生的时候,才是有条理的。在</p>
<pre><code>a1 = App()
a2 = App()
assert a1.myfunc.__func__ is a2.myfunc.__func__
assert id(a1.myfunc) is id(a2.myfunc) # Methods have some weirdness that means that won't equate but id's show they are the same
</code></pre>
<p>这就是为什么需要self为实例获取唯一的命名空间。这也是为什么您不能以这种方式获得实例所特有的decorator。
另一种考虑方法是,在生成实例之前必须定义类。因此,在类的定义中不能使用实例。在</p>
<h2>解决方案</h2>
<p>decorator需要以一种不存储任何实例属性的方式编写。它将访问应用程序实例属性。在</p>
^{pr2}$
<p>现在我假设MySerial将为每个App实例提供一个唯一的文件、端口或其他东西。这是串行配置中记录的内容。如果流是打开一个关闭的流,这可能不太优雅,但是您应该能够为您的确切应用程序改进这一点。在</p>