如何在Python内置类方法中添加回调或挂钩?

时间:2015-04-09 18:59:42

标签: python-2.7

我正在尝试收集有关正在打开和关闭的文件的信息,以便我可以跟踪哪些进程正在执行哪些操作。我与不会系统地使用自定义I / O函数和方法的用户一起工作,所以我想改变内置函数的行为。

我想出了一种改变开放功能的方法。它可能不是最佳的,但它确实有效。

import logging
import os
import sys
import io
import logging
import __builtin__


def custom_open(file_name, access_mode, buffering = 0):
    logging.debug('Opening file ' + file_name)    
    return __builtin__.open(file_name, access_mode, buffering)

logging.getLogger('').setLevel(logging.DEBUG)

open = custom_open

f = open('workfile', 'w')

f.write('This is a test\n')       

f.close()

我现在要做的是更改文件关闭方法的行为。我尝试了一些但没有任何作用。

1 个答案:

答案 0 :(得分:0)

详细说明我的评论,因为似乎没有其他人提交答案:

# Create a custom file class
class custom_file(file): 
    def close(self): 
        # do logging
        super(file, self).close()

# create a custom file opener
def custom_open(*args, **kwargs):
    # do logging
    return custom_file(*args, **kwargs)

# Set local `open` to point to your custom_open fn
open = custom_open

隐含在这里(我没有做研究,所以它可能是错的)是open('bla')只是呼唤file.__init__('bla'),所以要小心。

编辑:您可能还需要确保覆盖file上的其他方法,例如flush或其他任何会导致Python触及磁盘的方法。