我一直在努力寻找一个学习装饰师的用例,我想我已经找到了一个与我相关的用例
我正在使用以下代码
在文件class1.py
中,我有:
import pandas as pd, os
class myClass():
def __init__(self):
fnDone = f'C:\user1\Desktop\loc1\fn.csv'
if os.path.exists(fnDone): return
self.Fn1()
pd.DataFrame({'Done': 1}, index=[0]).to_csv(fnDone)
def Fn1(self):
print('something')
if __name__ == '__main__':
myClass()
在文件class2.py
中,我有:
class myClassInAnotherFile():
def __init__(self):
fnDone = f'C:\user1\Desktop\loc2\fn.csv'
if os.path.exists(fnDone): return
self.Fn1()
self.Fn2()
pd.DataFrame({'Done': 1}, index=[0]).to_csv(fnDone)
def Fn1(self):
print('something')
def Fn2(self):
print('something else')
if __name__ == '__main__':
myClassInAnotherFile('DoneFile12)
是否有一种方法可以在另一个名为utilities.py
的文件中定义通用装饰器代码,以便我可以执行以下操作:
在文件class1.py
中需要的,我有:
import pandas as pd, os
class myClass():
def __init__(self):
fnDone = f'C:\user1\Desktop\loc1\fn.csv'
self.Fn1()
pd.DataFrame({'Done': 1}, index=[0]).to_csv(fnDone)
def Fn1(self):
print('something')
if __name__ == '__main__':
@myDecorator
myClass()
在文件class2.py
中,我有:
class myClassInAnotherFile():
def __init__(self):
fnDone = f'C:\user1\Desktop\loc2\fn.csv'
self.Fn1()
self.Fn2()
pd.DataFrame({'Done': 1}, index=[0]).to_csv(fnDone)
def Fn1(self):
print('something')
def Fn2(self):
print('something else')
if __name__ == '__main__':
@myDecorator
myClassInAnotherFile()
本质上是使用装饰器模仿原始行为
编辑1:
我希望扩展我的类定义的功能。在这两个原始类定义中,我重复了检查fnDone
文件的代码,如果该文件存在,则退出该类目标是有一个decorator来检查fnDone
文件,如果该文件存在,则退出该类。
编辑2: 我也可以将其作为一个函数来实现,但我正在尝试学习如何使用装饰器扩展类或方法的功能
编辑3:
如果在class1.py
中使用以下内容,是否会更容易:
def myClass():
fnDone = f'C:\user1\Desktop\loc1\fn.csv'
if os.path.exists(fnDone): return
self.Fn1()
pd.DataFrame({'Done': 1}, index=[0]).to_csv(fnDone)
def Fn1(self):
print('something')
if __name__ == '__main__':
myClass()
和{
def myClassInAnotherFile():
fnDone = f'C:\user1\Desktop\loc2\fn.csv'
if os.path.exists(fnDone): return
self.Fn1()
self.Fn2()
pd.DataFrame({'Done': 1}, index=[0]).to_csv(fnDone)
def Fn1(self):
print('something')
def Fn2(self):
print('something else')
if __name__ == '__main__':
myClassInAnotherFile('DoneFile12)
我对@鸽子手给出的答案投了更高的票,因为您主要对使用类感兴趣。但这就是我如何使用常规函数实现您的目标,我认为这更有意义。出于@鸽子手提供的相同原因,将CSV文件名作为
myclass
函数的参数作为参数名fnDone是有意义的:下面是一个在运行代码之前检查文件是否存在的装饰程序:
文件:
my_decorator.py
文件:
class1.py
文件:
class2.py
一些注意事项:
doneFilename
的装饰器,它比简单的装饰器多添加了一层嵌套函数。您可以看到一个详细的示例here李>doneFilename
写入装饰器中,因为文件检查和文件写入是相关的。但这不是强制性的李>self
参数,因为在这个示例中并不真正需要类。如果你真的需要一个类,请不要把装饰器放在__init__
上,这样做:因为
fnDone
是一个局部变量而不是一个参数,所以使用decorator有点尴尬。如果您稍微修改代码,将fnDone
作为参数传入,则使用装饰器更为可行例如,您可以制作一个包装对象构造函数的装饰器,并检查传入的文件是否存在:
相关问题 更多 >
编程相关推荐