<p>我同意阿里的观点,你所做的并没有给你带来任何好处,所以可能不值得去做。你知道吗</p>
<p>但是,如果您确实想这样做,您可以滥用模块加载/<code>__getattr__</code>,并按照本<a href="https://stackoverflow.com/questions/2447353/getattr-on-a-module">post</a>中所述破解一个解决方案。你知道吗</p>
<p>基本上,如果我们有一个名为<code>foo.py</code>的文件,它是这样的:</p>
<pre><code>def hello(n):
print n
class NDayEMA(object):
def __init__(self, n, day):
self.n = n
self.day = day
</code></pre>
<p>然后,您需要将<code>foo.py</code>的内容更改为如下所示:</p>
<pre><code>import sys
class Testing(object):
@staticmethod
def hello(n):
print n
class NDayEMA(object):
def __init__(self, n, day):
self.n = n
self.day = day
def __getattr__(self, attr):
if attr.startswith('EMA'):
n = int(attr[3:])
return lambda day: self.NDayEMA(n, day)
else:
raise AttributeError
sys.modules[__name__] = Testing()
</code></pre>
<p>每当您试图调用对象中缺少的属性或方法时,<code>__getattr__</code>方法就会被调用。但是,没有一个<code>__getattr__</code>函数可以为模块工作。因此,我们要做的是将我们的模块转换成一个类,然后在最后用类替换模块。你知道吗</p>
<p>我们现在可以导入<code>foo</code>并执行以下操作:</p>
<pre><code>import foo
foo.hello(3)
a = foo.EMA39('test')
b = foo.EMA1000('test')
print a.n
print b.n
print 'done'
</code></pre>