为了账号安全,请及时绑定邮箱和手机立即绑定

A类在B类中被使用,所以A类必须在文件中先被定义?有先后顺序??

A类在B类中被使用,所以A类必须在文件中先被定义?有先后顺序??

拉风的咖菲猫 2019-04-09 20:24:50
django中对数据库增加额外的操作,有一种办法是增加额外的manager方法是为模块添加表级功能。比如下面这块代码段,我在models.py这个文件里面定义的:fromdjango.dbimportmodels#...AuthorandPublishermodelshere...classBookManager(models.Manager):deftitle_count(self,keyword):returnself.filter(title__icontains=keyword).count()classBook(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):returnself.title但是,发现一个问题,如果我先定义了Book()这个模型,再定义BookManager()这个模型,会报"NameError:name'BookManager'isnotdefined",显然是因为在Book类中使用了objects=BookManager()这个原因。而我印象中,似乎定义函数和类是没有先后关系的;会在使用的时候自动查看是否声明过。请大大帮指点下我这块的知识盲点。谢谢!!马年恭喜发财!
查看完整描述

2 回答

?
守候你守候我

TA贡献1802条经验 获得超10个赞

python是解释型语言,虽然会进行预编译生成pyc文件,但主要是对库引用等可重用部分进行一些处理,这块不是很了解哈哈~你可以看看这里
简单测试:
b_1=b()
classb:
pass
报错
NameError:name'b'isnotdefined
So,类不会在编译的时候提前声明...在python里面要遵循解释型语言的一些定义和处理原则。
解释型语言我就知道javascript会对声明型函数做预处理...但是也仅仅是对声明式的函数定义做预处理,你是不是记混了?以下javascript的函数声明做个参考~
//函数声明式定义
functionfoo(num1,num2){
returnnum1+num2;
}
//函数表达式定义
varfoo=function(num1,num2){
returnnum1+num2;
};
//使用Function构造函数定义
varfoo=newFunction("num1","num2","returnnum1+num2");
//实际上创建一个Function实例并不一定要赋值给具体的指针,可以直接执行
(function(x,y){returnx+y})(1,2);
//之所以用圆括号把function(){}括起来是因为js解释器会将function解释为函数声明,而函数声明不能直接跟着(x,y),我们需要将其转换为函数表达式。
//(1,2)表示要传递跟函数的参数。
//上面的例子也可以写成:
functionfoo(x,y){
returnx+y;
}(1,2);
//函数声明的方式无法定义匿名函数,因此如果想使用匿名函数,则必须用函数表达式的定义方式。
                            
查看完整回答
反对 回复 2019-04-09
?
森栏

TA贡献1810条经验 获得超5个赞

写类的函数时时需要的,因为在加载模块时定义也可以认为是被执行的,执行到
objects=BookManager()
发现BookManager名字不存在就报错了。
函数体或者类方法里面则没有这个限制,因为会从这个模块的globals()locals()里面来找名字,而加载时名字都已经放进去了
                            
查看完整回答
反对 回复 2019-04-09
  • 2 回答
  • 0 关注
  • 400 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信