无法装饰第三方只读功能,如何包装它以获得更多功能?

问题描述 投票:-1回答:1

我有以下(严重简化)装饰器:

def log_and_execute(func):
    def wrapper(*args, **kwargs):
        print(*args, **kwargs)
        return func(*args, **kwargs)
    return wrapper

我想用它来装饰pyodbc.connect.cursor

由于我显然无法编辑源代码来执行此操作,因此我尝试这样做:

import pyodbc

connection = pyodbc.connect("connection_string_here")
cursor = connection.cursor()

cursor.execute = log_and_execute(cursor.execute)

但是我收到以下错误:

AttributeError: 'pyodbc.Cursor' object attribute 'execute' is read-only

我应该怎么做,这样我就不必改变所有已经存在的cursor.execute电话?

python python-3.x pyodbc python-decorators
1个回答
2
投票

你不能改变pyodbc Cursor类,它是用C语言编写的,不允许设置属性。

你最好写一个包装类:

class CursorWrapper:
    def __init__(self, cursor):
        self.cursor = cursor

    def execute(self, *args, **kwargs):
        print(*args, **kwargs)
        return self.cursor.execute(*args, **kwargs)

    def __getattr__(self, attr):
        return getattr(self.cursor, attr)

    def __iter__(self):
        return iter(self.cursor)

    def __enter__(self):
        return self.cursor.__enter__()

    def __exit__(self, *args, **kwargs):
        return self.cursor.__exit__(*args, **kwargs)

然后每次将光标包装在该类中:

cursor = CursorWrapper(connection.cursor())
© www.soinside.com 2019 - 2024. All rights reserved.