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,我的疏忽让我错了