Python/Article/python12/5.md

34 lines
1.8 KiB
Markdown
Raw Normal View History

# 五、使用元类 #
终于到了使用元类了可是一般来说我们根本就用不上它就像Python 界的领袖 Tim Peters 说的:
> 元类就是深度的魔法99% 的用户应该根本不必为此操心。如果你想搞清楚究竟是否需要用到元类,那么你就不需要它。那些实际用到元类的人都非常清楚地知道他们需要做什么,而且根本不需要解释为什么要用元类。
元类的主要用途是创建 API。一个典型的例子是 Django ORM。它允许你像这样定义
```python
class Person(models.Model):
name = models.CharField(max_length=30)
age = models.IntegerField()
```
但是如果你这样做的话:
```python
guy = Person(name='bob', age='35')
print guy.age
```
这并不会返回一个 IntegerField 对象,而是会返回一个 int甚至可以直接从数据库中取出数据。这是有可能的因为 models.Model 定义了 `__metaclass__` 并且使用了一些魔法能够将你刚刚定义的简单的Person类转变成对数据库的一个复杂 hook。Django 框架将这些看起来很复杂的东西通过暴露出一个简单的使用元类的 API 将其化简,通过这个 API 重新创建代码,在背后完成真正的工作。
Python 中的一切都是对象,它们要么是类的实例,要么是元类的实例,除了 type。type 实际上是它自己的元类,在纯 Python 环境中这可不是你能够做到的,这是通过在实现层面耍一些小手段做到的。
参考:
[https://stackoverflow.com/questions/100003/what-is-a-metaclass-in-python](https://stackoverflow.com/questions/100003/what-is-a-metaclass-in-python)
最后如果对本文有兴趣,可以关注公众号:
2017-12-22 08:14:43 +00:00
![公众号](http://twowater.com.cn/images/20171204192251900.gif)