委托(delegate)是许多设计模式(如Decorator, Proxy)的基础,实现委托的一般方法是在委托类为每个需要委托的方法定义一个方法,它的仅有的实现就是对被委托对象调用同样的方法。例如,要实现ImmutableList,可以这样做:
class ImmutableList(object):
def __init__(self, delegate):
self.delegate = delegate
def __getitem__(self, i):
return self.delegate.__getitem__(i)
def __getslice__(self, i, j):
return self.delegate.__getslice__(i, j)
def __len__(self):
return self.delegate.__len(self)
def index(self, v):
return self.delegate.index(v)
# ... more ...
显然写这样的方法很是枯燥乏味,幸而在python中可以不需这样做,因为在python中类的方法可以动态添加, 说白其实就是给类添加属性,只是它的属性恰好是个函数罢了。给实例添加属性可以用__new__方法,而给类添加属性就要依赖metaclass了。好了,我们来看怎样用metaclass来实现委托。
class DelegateMetaClass(type):
def __new__(cls, name, bases, attrs):
methods = attrs.pop('delegated_methods', ())
for m in methods:
def make_func(m):
def func(self, *args, **kwargs):
return getattr(self.delegate, m)(*args, **kwargs)
return func
attrs[m] = make_func(m)
return super(DelegateMetaClass, cls).__new__(cls, name, bases, attrs)
class Delegate(object):
__metaclass__ = DelegateMetaClass
def __init__(self, delegate):
self.delegate = delegate
有了上面的,实现ImmutableList就很简单了,只需要继承Delegate,并定义需要委托的方法就好了:
class ImmutableList(Delegate):
delegated_methods = ( '__contains__', '__eq__', '__getitem__', '__getslice__',
'__str__', '__len__', 'index', 'count')
再实现ImmutableDict:
class ImmutableDict(Delegate):
delegated_methods = ('__contains__', '__getitem__', '__eq__', '__len__', '__str__',
'get', 'has_key', 'items', 'iteritems', 'iterkeys', 'itervalues', 'keys', 'values')
很简单吧!其实DelegateMetaClass还是很复杂的,尤其对于初学者理解起来很费劲,我可能下次会写点这方面的东西。顺便说下,django大量用到metaclass。
分享到:
相关推荐
python-metaclass.py
在Python编程语言中,字典、集合和不可变集合是三种重要的数据结构,它们各自具有独特的特性和用途。本篇文章将深入探讨这些概念,并详细解释它们的赋值机制。 首先,我们来了解一下**字典(Dictionary)**。字典是...
本文实例讲述了Python使用metaclass实现Singleton模式的方法。分享给大家供大家参考。具体实现方法如下: class Singleton(type): def __call__(cls, *args, **kwargs): print "Singleton call" if not hasattr...
执行Java的Class文件时,需要注意的是,Python并不运行在JVM上,所以它不能直接调用Java的库或依赖。这意味着,如果你的Java代码依赖于特定的系统库或Java API,Python可能无法正确地模拟执行。然而,对于那些只包含...
"metaclass-1.0-py2.py3-none-any.whl"表明这个库兼容Python 2和3,而且是“none”平台特定的,这意味着它不包含任何特定操作系统相关的实现,可以在任何支持Python的平台上运行。 安装这个元类库的方法通常是通过...
### Python中的Metaclass原理与用法详解 #### 一、Metaclass的概念 Metaclass,即“元类”,在Python中是一种特殊类型的类,用于创建其他的类。换句话说,元类是类的制造者,正如类是对象的制造者一样。Python语言...
列表是可变的有序序列,元组是不可变的有序序列,字典是键值对的无序集合,集合是不重复元素的无序集合。理解它们的特点和操作方法是Python编程的基础。 5. **字符串操作** Python字符串是不可变的,但提供了丰富...
### 深入Python的元宇宙:探索元类(Metaclass)的奥秘 #### Python 简介 Python 是一种流行的高级编程语言,由 Guido van Rossum 于 1989 年底发明,并于 1991 年发布了第一个公开发行版。Python 的设计哲学强调...
python 实现 观察者模式4(委托) python 实现 简单工厂模式 python 实现 命令模式 python 实现 模板方法模式 python 实现 桥接模式 python 实现 适配器模式 python 实现 外观模式 python 实现 原型模式 python 实现...
Python-Metar Python-metar是一个Python软件包,用于解释METAR和SPECI编码的天气报告。 METAR和SPECI是编码的航空天气报告。 官方编码方案在世界气象组织(WMO)编码手册A卷(I.1卷)(WMO-306 IiA)中进行了规定...
不能是列表、字典和集合等可变数据类型;创建集合的方式很简单,只需将逗号分隔的不同元素使用大括号括起来即可。由于集合元素是无序的,集合的打印效果与定义顺序可以不一致,且由于集合元素独一无二,使用集合类型...
可变形卷积网络的官方实现,Deformable Convolutional Networks
9. **Python 3的`@abstractmethod`装饰器兼容**:`six.add_metaclass(six.with_metaclass)`可以用于在Python 2中实现类似Python 3的抽象基类。 `six-1.10.0-py2.py3-none-any.whl`是一个wheel格式的安装包,它是...
特征选择方法中的Relief算法,利用python实现。可用于二分类标签的特征降维。
基于Java和Python实现的函数,用于计算实数集合的和.zip 基于Java和Python实现的函数,用于计算实数集合的和.zip 基于Java和Python实现的函数,用于计算实数集合的和.zip 基于Java和Python实现的函数,用于计算实数...
### 详解Python单例模式与Metaclass #### 单例模式概述 单例模式是一种常用的软件设计模式,它确保一个类只有一个实例,并提供一个全局访问点。这种模式在某些情况下非常有用,比如当应用程序需要控制资源访问时...
### Python 中 Meta Classes详解 #### 元类概览与起源 元类,或者说是Meta Classes,在Python编程领域中扮演着非常特殊的角色。它们是类的类,或者说是一种用来定义类本身的类。理解元类的前提是对Python中的类有...
Python中,数值类型(int和float)、字符串str、元组tuple都是不可变类型。而列表list、字典dict、集合set是可变类型。 还是看代码比较直观。先看不可变对象 不可变对象的例子 先说明一点is 就是判断两
提问者自称已经掌握了有关Python OOP编程中的各种概念,但始终觉得元类(metaclass)难以理解。他知道这肯定和自省有关,但仍然觉得不太明白,希望大家可以给出一些实际的例子和代码片段以帮助理解,以及在什么情况下...