【发布时间】:2021-10-10 12:57:42
【问题描述】:
我一直在寻找一个学习装饰器的用例,我想我找到了一个与我相关的用例。
我正在使用以下代码。
在文件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 文件的代码,如果存在,则退出该类。 目标是有一个装饰器检查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()
和class2.py如下:
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)
【问题讨论】:
-
抱歉,不清楚装饰器在这里应该做什么。唯一的区别似乎是
fnDone的(有点可疑的)使用从__init__中删除了——这是装饰者无法做到的。 -
@MisterMiyagi 我更新了问题。
-
我仍然不确定你想要完成什么,但装饰器可能不是正确的工具。抛开装饰器(或任何其他实现细节),您希望能够做什么?
-
另外,一般来说,使用类的
__init__方法将一些任务组合在一起通常没有多大意义。为什么不直接写一个函数呢? -
也许,这不是学习装饰器的最佳玩具任务。在这个问题中,继承会是一个更简洁的解决方案,而装饰器是一种反模式
标签: python python-decorators python-3.8