2013-12-12 78 views
0

我希望能够能够从我的模型“ModelLog”以下列方式运行的函数:蟒蛇改写初始化

ModelLog.create_log(user, obj1, obj2) 

,而不是创建第一和空对象与它一起通过。 现在我想通过重写init可以做到这一点,但公平地说,这对我来说是全新的。

我班ModelLog有这个方法:

class ModelLog(models.Model): 

    def create_log(user_obj, old_obj, new_obj): 
     """ Create a log about the changes of an object""" 

     "Some Code" 

当我用ModelLog.create_log(用户,OBJ1,OBJ2)来执行我的create_log方法我收到以下错误:

类型错误:未绑定的方法create_log()必须与ModelLog实例作为第一个参数来调用(得到用户实例,而不是)

现在我想我需要做的是这样的:

def __init__(self, user_obj, old_obj, new_obj): 
    self.user_obj = user_obj 
    self.old_obj = old_obj 
    self.new_obj = new_obj 

但很明显,这不是工作,有人能让我在正确的方向,并帮助我在这里?

+0

我字面上试图了解你的意图5分钟。但我不能说我明白了。 – scriptmonster

+1

您的ModelLog是否继承自任何类? –

+0

对不起,我说我真的不知道init是如何工作的。 。我想它是的,即时通讯使用djangoframework,所以我的模型是类ModelLog(模型。Model): –

回答

2

问题是你正在调用类方法。当你在python中定义一个方法时,你需要添加一个额外的参数来代表调用的对象实例或者类(比如你的情况)。

所以,你应该重写代码:

def create_log(cls, user_obj, old_obj, new_obj): 
    """ Create a log about the changes of an object""" 

或者更Python的方式:

@classmethod 
def create_log(cls, user_obj, old_obj, new_obj): 
    """ Create a log about the changes of an object""" 

或者如果你想有一个静态方法:

@staticmethod 
def create_log(user_obj, old_obj, new_obj): 
    """ Create a log about the changes of an object""" 

如果您有兴趣(困惑)我建议你阅读this

+0

是的这项工作,现在让我们了解更多关于我在这里做什么的信息。我的头脑似乎在理解这部分的时候有问题 –

0

至于你的错误,你需要提供一个虚拟的第一个参数create_log,并宣布它@classmethod

class ModelLog: 

    @classmethod 
    def create_log(self, user_obj, old_obj, new_obj): 
    ... 

注意额外self

1

如果你想能够调用create_log作为一个静态方法(一个不链接到单个对象),你需要使用static method decorator

尝试做这样的事情

class ModelLog(models.Model): 

    @staticmethod 
    def create_log(user_obj, old_obj, new_obj): 
     """ Create a log about the changes of an object""" 

     pass #Create your object here 

您可能不需要为此用例自定义您的__init__方法,现在就忘记了这一点。

+0

感谢这似乎工作,现在我gonne谷歌更多关于我现实中做的事情 –