`
huangyiiiiii
  • 浏览: 119021 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
社区版块
存档分类
最新评论

metaclass in python (part 2)

阅读更多
接着上一篇的讲。

现在我们知道了,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,),
{'a':1, '__module__':'current module name', '__metaclass__':the object Meta, '__init__':function object __init__})
(class的语法原来只是个语法糖而已,汗!)
由此可见 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):
def _class(a):
return a
return _class

class Temp(object):
'''
>>> Temp(1)
1
>>> Temp('hello')
'hello'
'''
__metaclass__ = Meta
继续分析,虽然可以像上面那样恶搞,不过要想写个有点实际用处的 metaclass ,还是通过 class 来实现比较方便。
最典型的方法便是直接继承 type 了,毕竟那是所有 new-style class 的 metaclass,在 python3000 里就要成为所有 class 默认的 metaclass 了。
可以说大部分 metaclass 的实现都是这么做的,不过下面要分析的这一例却是个例外,虽然不像上面我们写的那个 metaclass 那么奇怪,不过分析起来也不是那么容易的。

不过我们还需要继续澄清一些事实,先看这个例子:
class Temp(object):
@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
在默认的 metaclass type 的实现中,上面这句,也就是 type 的 __call__ 方法,其实是分以下两步完成的:
t = Temp.__new__(Temp, 2) # 调用 staticmethod __new__,创建 instance
t.__init__(2) # 调用该 instance 的构造函数,初始化 instance
另外,既然 Temp 实现了 __getattribute__, t.a 实际上等价于:
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(元类)
分享到:
评论

相关推荐

    python中metaclass原理与用法详解

    本文实例讲述了python中metaclass原理与用法。分享给大家供大家参考,具体如下: 什么是 metaclass. metaclass (元类)就是用来创建类的类。在前面一篇文章《python动态创建类》里我们提到过,可以用如下的一个观点来...

    python-metaclass.py

    python-metaclass.py

    Hands-On Meta Learning with Python.epub

    Meta learning using one-shot learning, MAML, Reptile, and Meta-SGD with TensorFlow

    Python库 | metaclass-1.0-py2.py3-none-any.whl

    在本例中,我们关注的是一个名为"metaclass-1.0-py2.py3-none-any.whl"的Python库。这个库特别之处在于它与Python中的元类(metaclasses)有关,元类是Python面向对象编程中的一个高级概念。 元类是Python中创建类...

    深入Python的元宇宙:探索元类(Metaclass)的奥秘

    ### 深入Python的元宇宙:探索元类(Metaclass)的奥秘 #### Python 简介 Python 是一种流行的高级编程语言,由 Guido van Rossum 于 1989 年底发明,并于 1991 年发布了第一个公开发行版。Python 的设计哲学强调...

    Python使用metaclass实现Singleton模式的方法

    本文实例讲述了Python使用metaclass实现Singleton模式的方法。分享给大家供大家参考。具体实现方法如下: class Singleton(type): def __call__(cls, *args, **kwargs): print "Singleton call" if not hasattr...

    python six 包

    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中的Metaclass元类创建与使用详解 #### 一、引言 在Python中,元类(Metaclass)是一个非常强大的概念,它允许我们控制类的行为和特性。通过使用元类,我们可以自定义类的创建过程,实现更加灵活和高级的...

    深入理解Python中的元类(metaclass)

    提问者自称已经掌握了有关Python OOP编程中的各种概念,但始终觉得元类(metaclass)难以理解。他知道这肯定和自省有关,但仍然觉得不太明白,希望大家可以给出一些实际的例子和代码片段以帮助理解,以及在什么情况下...

    Python探索之Metaclass初步了解

    Python中的元类(Metaclass)是一个高级特性,用于控制类的创建过程。元类是创建类的对象的类,也就是说,当我们定义一个类时,实际上是在创建一个特定类型的对象,而这个对象的类型就是由元类决定的。元类提供了一...

    python-metar:解析已编码METAR天气报告的python包

    Python-Metar Python-metar是一个Python软件包,用于解释METAR和SPECI编码的天气报告。 METAR和SPECI是编码的航空天气报告。 官方编码方案在世界气象组织(WMO)编码手册A卷(I.1卷)(WMO-306 IiA)中进行了规定...

    Python-Six一个Python2和3的兼容性库

    最后,Six库还支持元类的兼容,如`six.add_metaclass()`可以帮助创建兼容Python2和Python3的元类。 总之,Python-Six库是Python开发者在面对跨版本兼容问题时的重要工具。它通过一系列适配器和模拟,使得代码能够在...

    Pro Python 2nd edition 英文pdf

    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库 | meta_ml-0.0.16-py3-none-any.whl

    资源分类:Python库 所属语言:Python 资源全名:meta_ml-0.0.16-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    python面试题

    Python中的元类(Metaclass)** 元类是用于创建类的类,它允许开发者自定义类的行为。虽然不是日常编程中经常使用的特性,但在某些复杂场景如ORM框架中却非常有用。元类使得Python具有高度的灵活性,可以定制类的...

Global site tag (gtag.js) - Google Analytics