Python 如何布置课堂方法

Python 如何布置课堂方法,python,class,decorator,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

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

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的类方法,或者如何使异常捕获和日志记录不那么痛苦?

您希望将您的函数调用为
create(email=)i@example.com“,password='secret')
。您正在将包装器函数调用为
u.\u internal(email=)i@example.com“,password='secret')
,它会自动转换(因为您正在调用一个方法)为
\u-inner(u,email='classe')i@example.com“,password='secret')

您应该将
self
添加到
\u-inner
的参数中,例如
\u-inner(self,


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

您的装饰程序中有一个错误:

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

这不起作用,我得到了相同的异常2012-09-08 18:38:38040错误[hairs.model.user][worker 1]创建()正好接受1个参数(2个给定)创建()正好接受1个参数(2个给定)许多thx,我的疏忽让我错了