- 浏览: 118735 次
- 性别:
最近访客 更多访客>>
文章分类
最新评论
-
差沙:
应该有django的Model
metaclass in python (part 1) -
beyking:
哈哈,恭喜
老子毕业了 -
towjzhou:
晕死,这种符号能打出来吗?
新的 pep ! -
xlp223:
好,需要这样的例子。自己用只能是从文档中获取一些,高级的用法, ...
SQLAlchemy Examples -
xlp223:
sql是个基础,脱离它去谈orm,有如纸上谈兵。
强大的 sqlalchemy
接着上一篇的讲。
现在我们知道了,metaclass 生 class,class 生 instance。
但是 metaclass 还可以有它的 metametaclass,metametaclass 还可以有... 如果反复,永无止境。这样想起来,脑袋就有点晕了。
其实在 python 中万物皆对象而已,所有对象皆有其类型,对象的类型也还是对象!而类型对象的类型就是它自己。
而前面说过的所谓 instance、class、metaclass 等东西,都只是不同种类的对象而已。
判断对象是什么对象的唯一方法就是通过其提供的“接口”,这就是所谓的 duck type!只要一个对象实现了成为一个 class 所需的接口,它就是 class !metaclass 亦然。
那么我们不如先来讨论讨论 metaclass 的接口吧,看看究竟需要实现哪些接口能使一个对象成为一个 metaclass。
先来看一些等价关系:
由此可见 Meta 首先应该是个 callable,并且应该接受如上所示的三个参数。
而我们知道 Temp 对象其实是调用 Meta 所返回的,也就是说 Meta 这个 callable 对象返回的还应该是一个 callable 对象。
典型地,如果 Meta 是一个 class,意味着它应该实现一个 __call__ 方法。这样的话,那么上面那句就可以等价为:
不急,在继续分析之前我们不妨利用刚才发现的这一点搞点小怪先,呵呵。
最典型的方法便是直接继承 type 了,毕竟那是所有 new-style class 的 metaclass,在 python3000 里就要成为所有 class 默认的 metaclass 了。
可以说大部分 metaclass 的实现都是这么做的,不过下面要分析的这一例却是个例外,虽然不像上面我们写的那个 metaclass 那么奇怪,不过分析起来也不是那么容易的。
不过我们还需要继续澄清一些事实,先看这个例子:
参考:
Unifying types and classes in Python 2.2 这是老大对 python2.2 以后的“python对象模型”的深刻的描述
The Python 2.3 Mehod Resolution Order 这也是今天碰巧看到的好文,虽然与本文没有什么联系,不过,此文深入讲解了 python2.3 以后对多继承的实现, 我也是看完这篇才知道实现个多继承是如此的复杂,不过幸好他们找到了合适的算法。 另外对于平时不经常接触算法的人(比如我)来说,偶尔用数学的思维思考思考还有很有好处的。
New-style Classes 这里是 new-style class 相关的文献的集合。
另外想找这方面中文资料的兄弟可以去啄木鸟:python中的新型类及其实例详解 Metaclasses(元类)
现在我们知道了,metaclass 生 class,class 生 instance。
但是 metaclass 还可以有它的 metametaclass,metametaclass 还可以有... 如果反复,永无止境。这样想起来,脑袋就有点晕了。
其实在 python 中万物皆对象而已,所有对象皆有其类型,对象的类型也还是对象!而类型对象的类型就是它自己。
而前面说过的所谓 instance、class、metaclass 等东西,都只是不同种类的对象而已。
判断对象是什么对象的唯一方法就是通过其提供的“接口”,这就是所谓的 duck type!只要一个对象实现了成为一个 class 所需的接口,它就是 class !metaclass 亦然。
那么我们不如先来讨论讨论 metaclass 的接口吧,看看究竟需要实现哪些接口能使一个对象成为一个 metaclass。
先来看一些等价关系:
class Temp(object):上面代码其实等价于:
__metaclass__ = Meta
a = 1
def __init__(self, a):
self.a = a
Temp = Meta('Temp', (object,),(class的语法原来只是个语法糖而已,汗!)
{'a':1, '__module__':'current module name', '__metaclass__':the object Meta, '__init__':function object __init__})
由此可见 Meta 首先应该是个 callable,并且应该接受如上所示的三个参数。
t = Temp(2) # 构建 Temp 的 instance从这一句我们可以看出 Temp 也应该是个 callable 对象。
而我们知道 Temp 对象其实是调用 Meta 所返回的,也就是说 Meta 这个 callable 对象返回的还应该是一个 callable 对象。
典型地,如果 Meta 是一个 class,意味着它应该实现一个 __call__ 方法。这样的话,那么上面那句就可以等价为:
t = Temp.__call__(2)上面说的这几点基本上可以作为判断一个对象能否成为 metaclass 的标准了:一个接受三个参数并返回另一个 callable 对象的 callable 对象!
不急,在继续分析之前我们不妨利用刚才发现的这一点搞点小怪先,呵呵。
def Meta(name, bases, attrs):继续分析,虽然可以像上面那样恶搞,不过要想写个有点实际用处的 metaclass ,还是通过 class 来实现比较方便。
def _class(a):
return a
return _class
class Temp(object):
'''
>>> Temp(1)
1
>>> Temp('hello')
'hello'
'''
__metaclass__ = Meta
最典型的方法便是直接继承 type 了,毕竟那是所有 new-style class 的 metaclass,在 python3000 里就要成为所有 class 默认的 metaclass 了。
可以说大部分 metaclass 的实现都是这么做的,不过下面要分析的这一例却是个例外,虽然不像上面我们写的那个 metaclass 那么奇怪,不过分析起来也不是那么容易的。
不过我们还需要继续澄清一些事实,先看这个例子:
class Temp(object):在默认的 metaclass type 的实现中,上面这句,也就是 type 的 __call__ 方法,其实是分以下两步完成的:
@staticmethod # 这一句可以忽略,不管有没有这句,__new__ 都是静态方法
def __new__(cls, a):
return object.__new__(cls, a)
def __init__(self, a):
self.a = a
def __getattribute__(self, name):
return super(Temp, self).__getattribute__(name)
def __getattr__(self, name):
return super(Temp, self).__getattr__(name)
t = Temp(2)
print t.a
t = Temp.__new__(Temp, 2) # 调用 staticmethod __new__,创建 instance另外,既然 Temp 实现了 __getattribute__, t.a 实际上等价于:
t.__init__(2) # 调用该 instance 的构造函数,初始化 instance
try:到这里基本上一些概念问题已经搞清楚了,下一篇终于可以正式开始研究这里的代码了。
t.__getattribute__(self, 'a')
except AttributeError:
t.__getattr__(self, 'a')
参考:
Unifying types and classes in Python 2.2 这是老大对 python2.2 以后的“python对象模型”的深刻的描述
The Python 2.3 Mehod Resolution Order 这也是今天碰巧看到的好文,虽然与本文没有什么联系,不过,此文深入讲解了 python2.3 以后对多继承的实现, 我也是看完这篇才知道实现个多继承是如此的复杂,不过幸好他们找到了合适的算法。 另外对于平时不经常接触算法的人(比如我)来说,偶尔用数学的思维思考思考还有很有好处的。
New-style Classes 这里是 new-style class 相关的文献的集合。
另外想找这方面中文资料的兄弟可以去啄木鸟:python中的新型类及其实例详解 Metaclasses(元类)
发表评论
-
如何在醉酒的情况下编写正确的程序
2007-06-22 09:12 1307答案很简单:Test Driven。哈哈,这个(http:// ... -
Evolution of a Python programmer
2007-05-26 07:51 1379http://dis.4chan.org/read/prog/ ... -
Python and vim: Two great tastes that go great together
2007-05-26 08:29 1710Python and vim: Two great taste ... -
字典与动态语言
2007-03-19 10:18 1391字典(或者叫哈希表、关联数组..)与动态语言的渊源可谓极深。动 ... -
使用 python 模拟 ruby 的 open class
2007-01-27 11:42 1301老早就写了这些代码,但一直懒得为它写篇博客,我觉得我永远也无法 ... -
do it runtime
2007-01-20 11:19 2650第一次从静态语言到动态语言的人肯定在思维上需要 ... -
PLY: 一个以教学为目的的lex、yacc实现
2006-09-16 12:37 3846官方网站 想学或正在学编译原理的同学可不要错过了,要是上个学期 ... -
意外收获:get_caller
2006-09-16 14:01 1240阅读 PLY 的 lex.py 的时候 ... -
python is obvious !
2006-09-18 17:40 1361初识 python 的时候常常会被一些陌生的概念绊倒,而当熟悉 ... -
compatibility of IronPython
2006-09-19 03:58 1765IronPython 1.0 的发布,在邮件列表中引起了很多争 ... -
Be Pythonic
2006-10-19 03:05 1133Be PythonicWhat is PythonicPyth ... -
a python tutorial
2006-12-04 08:01 1491A Very Brief Introduction To Py ... -
metaclass in python (part 1)
2006-12-12 14:15 2670python 的东西虽然概念上容易理解 ,但是实际用起来却也不 ... -
python types and objects
2006-12-16 14:02 1337在探寻 metaclass 的过程 ... -
selfless python
2006-12-18 04:07 1093Eliminating self with Metaclass ... -
python virtual machines
2006-12-24 13:22 1488Jython,IronPython,PyPy。 ... -
理解 python 的 method 和 function 兼谈 descriptor
2007-01-01 07:34 4970总是看到有人对 python 中的 method 和 func ... -
写了个方便下载 tudou 网视频的小程序
2007-01-09 12:26 1758http://huangyilib.googlecode.co ... -
Build extensible application with egg
2007-01-17 02:49 1783在 python 社区中 egg 已经 ...
相关推荐
本文实例讲述了python中metaclass原理与用法。分享给大家供大家参考,具体如下: 什么是 metaclass. metaclass (元类)就是用来创建类的类。在前面一篇文章《python动态创建类》里我们提到过,可以用如下的一个观点来...
python-metaclass.py
Meta learning using one-shot learning, MAML, Reptile, and Meta-SGD with TensorFlow
在本例中,我们关注的是一个名为"metaclass-1.0-py2.py3-none-any.whl"的Python库。这个库特别之处在于它与Python中的元类(metaclasses)有关,元类是Python面向对象编程中的一个高级概念。 元类是Python中创建类...
### 深入Python的元宇宙:探索元类(Metaclass)的奥秘 #### Python 简介 Python 是一种流行的高级编程语言,由 Guido van Rossum 于 1989 年底发明,并于 1991 年发布了第一个公开发行版。Python 的设计哲学强调...
本文实例讲述了Python使用metaclass实现Singleton模式的方法。分享给大家供大家参考。具体实现方法如下: class Singleton(type): def __call__(cls, *args, **kwargs): print "Singleton call" if not hasattr...
9. **Python 3的`@abstractmethod`装饰器兼容**:`six.add_metaclass(six.with_metaclass)`可以用于在Python 2中实现类似Python 3的抽象基类。 `six-1.10.0-py2.py3-none-any.whl`是一个wheel格式的安装包,它是...
### 详解Python单例模式与Metaclass #### 单例模式概述 单例模式是一种常用的软件设计模式,它确保一个类只有一个实例,并提供一个全局访问点。这种模式在某些情况下非常有用,比如当应用程序需要控制资源访问时...
### Python中的Metaclass元类创建与使用详解 #### 一、引言 在Python中,元类(Metaclass)是一个非常强大的概念,它允许我们控制类的行为和特性。通过使用元类,我们可以自定义类的创建过程,实现更加灵活和高级的...
提问者自称已经掌握了有关Python OOP编程中的各种概念,但始终觉得元类(metaclass)难以理解。他知道这肯定和自省有关,但仍然觉得不太明白,希望大家可以给出一些实际的例子和代码片段以帮助理解,以及在什么情况下...
Python中的元类(Metaclass)是一个高级特性,用于控制类的创建过程。元类是创建类的对象的类,也就是说,当我们定义一个类时,实际上是在创建一个特定类型的对象,而这个对象的类型就是由元类决定的。元类提供了一...
Python-Metar Python-metar是一个Python软件包,用于解释METAR和SPECI编码的天气报告。 METAR和SPECI是编码的航空天气报告。 官方编码方案在世界气象组织(WMO)编码手册A卷(I.1卷)(WMO-306 IiA)中进行了规定...
最后,Six库还支持元类的兼容,如`six.add_metaclass()`可以帮助创建兼容Python2和Python3的元类。 总之,Python-Six库是Python开发者在面对跨版本兼容问题时的重要工具。它通过一系列适配器和模拟,使得代码能够在...
Pro Python 第2版,2014.12.17出版的新书 You’ve learned the basics of Python, but how do you take your skills to the next stage? Even if you know enough to be productive, there are a number of ...
资源分类:Python库 所属语言:Python 资源全名:meta_ml-0.0.16-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
Python中的元类(Metaclass)** 元类是用于创建类的类,它允许开发者自定义类的行为。虽然不是日常编程中经常使用的特性,但在某些复杂场景如ORM框架中却非常有用。元类使得Python具有高度的灵活性,可以定制类的...