liyan5953 发表于 2014-04-24 12:20

关于django中FileField源代码的问题

本帖最后由 liyan5953 于 2014-04-24 12:36 编辑

最近用django写一个缩略图上传的小应用,开始研究FileField的源代码。作为一个python新手,一看源代码就迷茫了。
所以想请教一下各位老鸟。
在源代码中
# The class to wrap instance attributes in. Accessing the file object off
# the instance will always return an instance of attr_class.
attr_class = FieldFile

# The descriptor to use for accessing the attribute off of the class.
descriptor_class = FileDescriptor

description = _("File")

The class to wrap instance attributes in.是什么意思啊,是一种python的惯用写法吗?
具体该如何实现呢?
哪位对这个有研究的老鸟,能给具体解释一下FileField的实现原理,以及FileField,FieldFile,FileDescriptor这三个类的具体关系呢?最好能举个简单的例子:)
3Q,very much。

liyan5953 发表于 2014-04-26 01:40

这个帖子发了很长时间了。一直没有人答复。不知道是咱们社区对python的理解就这么点?还是大家觉得我实在太菜,提这样的问题很可笑。
今天google到一篇说明问题的文章,发出来,给跟我一样在这个问题上的迷茫的菜鸟么。

究竟为什么要使用元类?
现在回到我们的大主题上来,究竟是为什么你会去使用这样一种容易出错且晦涩的特性?好吧,一般来说,你根本就用不上它:
“元类就是深度的魔法,99%的用户应该根本不必为此操心。如果你想搞清楚究竟是否需要用到元类,那么你就不需要它。那些实际用到元类的人都非常清楚地知道他们需要做什么,而且根本不需要解释为什么要用元类。”—— Python界的领袖 Tim Peters
元类的主要用途是创建API。一个典型的例子是Django ORM。它允许你像这样定义:
class Person(models.Model):
    name = models.CharField(max_length=30)
    age = models.IntegerField()
但是如果你像这样做的话:
guy= Person(name='bob', age='35')
print guy.age
这并不会返回一个IntegerField对象,而是会返回一个int,甚至可以直接从数据库中取出数据。这是有可能的,因为models.Model定义了__metaclass__, 并且使用了一些魔法能够将你刚刚定义的简单的Person类转变成对数据库的一个复杂hook。Django框架将这些看起来很复杂的东西通过暴露出一个简单的使用元类的API将其化简,通过这个API重新创建代码,在背后完成真正的工作。

chenxing0407 发表于 2014-04-29 23:42

我最近也在看代码, 对 metaclass 也不太理解。
description = _("File") ,第一开始看到 _ ,还以为是 interactive 模式下保留上一次运行的结果,查了下是本地化
from django.utils.translation import ugettext_lazy as _

ref: http://stackoverflow.com/questions/1962287/what-does-do-in-django-code

相互学习吧
页: [1]
查看完整版本: 关于django中FileField源代码的问题