gpt4 book ai didi

python - 在玩具示例中实现 python 装饰器

转载 作者:行者123 更新时间:2023-12-04 12:19:09 25 4
gpt4 key购买 nike

我一直在努力寻找一个用例来学习装饰器,我想我已经找到了一个与我相关的用例。
我正在使用以下代码。
在文件 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是一个局部变量而不是参数,这使得使用装饰器有点尴尬。如果稍微修改一下代码传入fnDone作为参数,它使使用装饰器成为更可行的选择。
例如,您可以制作一个包装对象构造函数的装饰器,并检查传入的文件是否存在:

import os.path
from functools import wraps

import pandas as pd

def check_file_exists(f):
@wraps(f)
def _inner(self, fn_done):
if os.path.exists(fn_done):
return
f(self, fn_done)
return _inner

class MyClass:
@check_file_exists
def __init__(self, fn_done) -> None:
pd.DataFrame({'Done': 1}, index=[0]).to_csv(fn_done)

if __name__ == "__main__":
MyClass("fn.csv")

关于python - 在玩具示例中实现 python 装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68667893/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com