擅长:python、mysql、java
<p>您的<code>ExposedMethod</code>实例的行为不像普通的实例方法,而是类似于静态方法——事实上,您给其中一个实例一个<code>self</code>参数提示您并不知道这一点。您可能需要将<code>__get__</code>方法添加到<code>ExposedMethod</code>类中,使其成为描述符,就像函数对象有关描述符的更多信息,请参见<a href="http://users.rcn.com/python/download/Descriptor.htm" rel="noreferrer">here</a>。在</p>
<p>但是有一种更简单的方法,因为函数可以有属性…:</p>
<pre><code>def ExposedMethod(registry=None):
def decorate(f):
f.registry = registry
return f
return decorate
</code></pre>
<p>在一个<em>类</em>修饰符中(比元类简单!需要Python2.6或更高版本的2.5或更早版本您需要使用元类或在<code>class</code>语句后显式地调用它,尽管答案的第一部分和下面代码的功能仍然很好):</p>
^{2}$
<p>所以你可以:</p>
<pre><code>@RegisterExposedMethods
class MyClass (object):
@ExposeMethod(WorkerFunctionRegistry)
def myCoolExposedMethod (self):
pass
</code></pre>
<p>诸如此类。这很容易扩展到允许一个公开的方法有多个注册中心,从其他地方而不是从类中获取默认注册表(它可以在类修饰符中,例如,如果这对您更有效的话)<strong>和</strong>避免与元类结合而不丢失任何功能。实际上,这正是Python2.6中引入类装饰器的原因:它们可以代替大约90%的元类实际使用,并且比自定义元类简单得多。在</p>