【问题标题】:How to decorate class method [closed]如何装饰类方法[关闭]
【发布时间】:2012-09-08 14:24:12
【问题描述】:

好的,我已经阅读了所有关于类方法装饰的问题,但我的情况不喜欢它们。

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

然后我尝试从继承的类用户调用方法创建:

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 的类方法,或者如何让异常捕获和记录更轻松?

【问题讨论】:

    标签: python class decorator


    【解决方案1】:

    你的装饰器有错误:

    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
    

    【讨论】:

    • 很多谢谢,我的疏忽让我错了
    【解决方案2】:

    您希望将您的函数称为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, ...

    但是,鉴于您的错误和其中出现的数字,您向我们展示的任何代码中都可能没有出现您的错误;它可能发生在某些子调用中(您可以通过在进入/退出函数时添加打印语句来检查)。

    【讨论】:

    • 这不起作用,我得到同样的异常 2012-09-08 18:38:38,040 错误 [hairs.model.user][worker 1] create() 只需要 1 个参数(给定 2 个)创建() 只需要 1 个参数(给定 2 个)
    猜你喜欢
    • 2013-03-07
    • 2019-11-06
    • 2018-01-20
    • 2019-02-03
    相关资源
    最近更新 更多