擅长:python、mysql、java
<p>您可以使用类修饰符(在Python2.6中)或元类执行您想要的操作。类装饰器版本:</p>
<pre><code>def rule(f):
f.rule = True
return f
def getRules(cls):
cls.rules = {}
for attr, value in cls.__dict__.iteritems():
if getattr(value, 'rule', False):
cls.rules[attr] = value
return cls
@getRules
class RuleClass:
@rule
def foo(self):
pass
</code></pre>
<p>元类版本将是:</p>
^{pr2}$
<p>请注意,这两种方法都不能满足您的要求(修改调用的名称空间),因为它是脆弱的、困难的,而且常常是不可能的。相反,它们都通过类修饰符或元类的<code>__init__</code>方法对类进行后处理,方法是检查所有属性并填充<code>rules</code>属性。两者之间的区别在于元类解决方案在Python2.5和更早版本(下至2.2)中工作,并且元类是继承的。对于decorator,子类必须分别应用decorator(如果它们想设置rules属性)</p>
<p>这两种解决方案都没有考虑继承性,它们在查找标记为规则的方法时不查看父类,也不查看父类<code>rules</code>属性。如果这是你想要的话,你也不难做到这一点。在</p>