如何装饰类方法

时间:2012-09-08 14:24:12

标签: python class decorator

好的,我已经阅读了有关课程方法装饰的所有问题,但我的情况并不像他们。

def safe_db(foo):
    def _inner(*args, **kwargs):
        try:
            foo(args, kwargs)
            return True
        except Exception as e:
            log.error(e.message)
            print e.message
            return False
    return _inner


class BaseDB(object):
    def __init__(self):
        self.connection = Connection()
        self.db = self.connection.goobi
        self.table = None

    @safe_db
    def create(self, **data):
        self.table.insert(data)

    def update(self, where, **data):
        try:
            self.table.update(where, {'$set': data})
            return True
        except Exception as e:
           log.error(e.message)
           print e.message
           return False

然后我尝试从继承类User:

创建调用方法
u = User()
u.create(email='i@example.com', password='secrete')

我得到例外:

2012-09-08 18:17:18,230 ERROR [hairs.model.user][worker 2] create() takes exactly 1      argument (2 given)
    create() takes exactly 1 argument (2 given)

我无法理解如何装饰BaseDB的类方法,或者我如何使异常捕获和记录更少痛苦?

2 个答案:

答案 0 :(得分:2)

你的装饰者有错误:

def safe_db(foo):
    def _inner(*args, **kwargs):
        try:
            foo(*args, **kwargs)   # fixed line
            return True
        except Exception as e:
            log.error(e.message)
            print e.message
            return False
    return _inner

答案 1 :(得分:-1)

您希望将您的功能称为create(email='i@example.com', password='secret')。您正在将包装函数调用为u._inner(email='i@example.com', password='secret'),它会自动转换(因为您正在调用方法)到_inner(u, email='i@example.com', password='secret')

您应该将self添加到_inner的参数,例如_inner(self, ...

但是,鉴于您的错误及其中出现的数字,可能是您向我们展示的任何代码中未出现错误;它可能发生在一些子下(你可以通过在进入/退出函数时添加print语句来检查)。