<p>下面是一个在运行代码之前检查文件是否存在的装饰程序:</p>
<p>文件:<code>my_decorator.py</code></p>
<pre><code>import os
import pandas as pd
def checkDoneDecorator(doneFilename):
def _decorator(decorated):
def _wrapper_function(*args, **kwargs):
if os.path.exists(doneFilename):
return
try:
result = decorated(*args, **kwargs)
finally:
pd.DataFrame({'Done': 1}, index=[0]).to_csv(doneFilename)
return _wrapper_function
return _decorator
</code></pre>
<p>文件:<code>class1.py</code></p>
<pre><code>from my_decorator import checkDoneDecorator
@checkDoneDecorator(doneFilename='C:\user1\Desktop\loc1\fn.csv')
def myClass():
Fn1()
def Fn1():
print('something')
if __name__ == '__main__':
myClass()
</code></pre>
<p>文件:<code>class2.py</code></p>
<pre><code>from my_decorator import checkDoneDecorator
@checkDoneDecorator(doneFilename='C:\user1\Desktop\loc2\fn.csv')
def myClassInAnotherFile():
Fn1()
Fn2()
def Fn1():
print('something')
def Fn2():
print('something else')
if __name__ == '__main__':
myClassInAnotherFile()
</code></pre>
<p>一些注意事项:</p>
<ul>
<li>我使用了一个带参数<code>doneFilename</code>的装饰器,它比简单的装饰器多添加了一层嵌套函数。您可以看到一个详细的示例<a href="https://www.artima.com/weblogs/viewpost.jsp?thread=240845#decorator-functions-with-decorator-arguments" rel="nofollow noreferrer">here</a></李>
<li>我还将<code>doneFilename</code>写入装饰器中,因为文件检查和文件写入是相关的。但这不是强制性的</李>
<li>我从您的示例中删除了<code>self</code>参数,因为在这个示例中并不真正需要类。如果你真的需要一个类,请不要把装饰器放在<code>__init__</code>上,这样做:</li>
</ul>
<pre><code>class myClass:
@checkDoneDecorator(doneFilename='C:\user1\Desktop\loc1\fn.csv')
def start(self):
self.Fn1()
def Fn1(self):
print('something')
if __name__ == '__main__':
myClass().start()
</code></pre>