我有一个模块,用户可以导入该模块,然后交互地访问方法 (学习here),这些方法将在具有Raspbian Jessie的Raspberry Pi上运行。
方法A 使用atexit
:
当通过exit()
退出python时,将执行最后的步骤(此处保存有令牌文件)但是如果我关闭终端窗口,则不会执行。
> from module import A
> a = A(7)
> a.sqrx()
'hey, x^2 = 49'
> exit()
方法B 使用了我所学到的context manager
的here:
尽管实例仍可用于交互式工作,但它立即执行最后的步骤。
> from module import B
> with B(4) as b:
> b.sqrx()
hello, I am B
hello, __enter__
'hey, x^2 = 16'
hello, __exit__
> b.sqrx()
'hey, x^2 = 16'
我也不想要,它是为了使对象可用于交互式工作,但是如果我通过exit()
退出python或意外关闭了终端窗口,然后关闭终端应用程序。
有没有办法做所有这些事情?
这是抽象的模块:
import atexit
class A(object):
def __init__(self, x, start_it=False):
self.x = int(x)
atexit.register(self.stop)
print 'hello, I am A'
def sqrx(self):
return "hey, x^2 = {}".format(self.x**2)
def stop(self):
fname = 'stop_{}.txt'.format(self.x)
with open (fname, 'w') as outfile:
outfile.writelines(['stop!\n', self.sqrx()])
class B(object):
def __init__(self, x, start_it=False):
self.x = int(x)
print 'hello, I am B'
def sqrx(self):
return "hey, x^2 = {}".format(self.x**2)
def stop(self):
fname = 'stop_{}.txt'.format(self.x)
with open (fname, 'w') as outfile:
outfile.writelines(['stop!\n', self.sqrx()])
def __enter__(self):
print 'hello, __enter__'
return self
def __exit__(self, type, value, traceback):
self.stop()