关于python类使用顺序问题的疑惑,python类顺序疑惑,django中对数据库增


django中对数据库增加额外的操作,有一种办法是增加额外的manager方法是为模块添加表级功能。

比如下面这块代码段,我在models.py这个文件里面定义的:

from django.db import models# ... Author and Publisher models here ...class BookManager(models.Manager):    def title_count(self, keyword):        return self.filter(title__icontains=keyword).count()class Book(models.Model):    title = models.CharField(max_length=100)    authors = models.ManyToManyField(Author)    publisher = models.ForeignKey(Publisher)    publication_date = models.DateField()    num_pages = models.IntegerField(blank=True, null=True)    objects = BookManager()    def __unicode__(self):        return self.title

但是,发现一个问题,如果我先定义了 Book() 这个模型,再定义BookManager() 这个模型,会报"NameError: name 'BookManager' is not defined",显然是因为在Book类中使用了objects = BookManager()这个原因。

而我印象中,似乎定义函数和类是没有先后关系的;会在使用的时候自动查看是否声明过。请大大帮指点下我这块的知识盲点。谢谢!!马年恭喜发财!

python是解释型语言,虽然会进行预编译生成pyc文件,但主要是对库引用等可重用部分进行一些处理,这块不是很了解 哈哈~ 你可以看看这里

简单测试:

b_1 = b()class b:    pass

报错

NameError: name 'b' is not defined

So, 类不会在编译的时候提前声明... 在python里面要遵循解释型语言的一些定义和处理原则。

解释型语言我就知道javascript会对声明型函数做预处理...但是也仅仅是对声明式的函数定义做预处理,你是不是记混了?以下javascript的函数声明做个参考~

//函数声明式定义function foo(num1,num2){    return num1 + num2;}//函数表达式定义var foo = function(num1,num2){    return num1 + num2;};//使用Function构造函数定义var foo = new Function("num1","num2","return num1 + num2");//实际上创建一个Function实例并不一定要赋值给具体的指针,可以直接执行(function(x,y){return x+y})(1,2);//之所以用圆括号把function(){}括起来是因为js解释器会将function解释为函数声明,而函数声明不能直接跟着(x,y),我们需要将其转换为函数表达式。//(1,2)表示要传递跟函数的参数。//上面的例子也可以写成:function foo(x,y){    return x+y;}(1,2);//函数声明的方式无法定义匿名函数,因此如果想使用匿名函数,则必须用函数表达式的定义方式。

写类的函数时时需要的,因为在加载模块时定义也可以认为是被执行的,执行到

objects = BookManager()

发现BookManager名字不存在就报错了。

函数体或者类方法里面则没有这个限制,因为会从这个模块的globals()locals()里面来找名字,而加载时名字都已经放进去了

编橙之家文章,

评论关闭