委托(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原理与用法。分享给大家供大家参考,具体如下: 什么是 metaclass. metaclass (元类)就是用来创建类的类。在前面一篇文章《python动态创建类》里我们提到过,可以用如下的一个观点来...
python-metaclass.py
主要介绍了Python使用metaclass实现Singleton模式的方法,实例分析了Python基于metaclass实现单例模式的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
python学习笔记,包含python字典-集合-不可变集合-赋值机制
python实现的简单的class解析以及简单执行class,使用python2解析java class文件,并简单执行 class,让大家更加了解class
在Python中我们用type函数可以动态地创建一个元类,同样也可以用__metaclass__属性来指定一个元类,接下来我们就来具体举例讲解Python中metaclass元类的创建与使用
如何在python中用HDFS文件系统实现高效存储,A File System for Supercomputing and Lay-Programming。
集合中的元素必须是可hash的,即不可变的数据类型。 空集合 a=set() 注意a={}创建的是一个空字典。 set —— 可变集合。集合中的元素可以动态的增加或删除。 frozenset —— 不可变集合。集合中的元素不可改变。 注...
解决Dolphinscheduler中从Mysql同步分表数据至Doris或者PG库的问题
cubic spline python实现 来源于PythonRobotics spline无需对X排序
python库。 资源全名:metaclass-1.0-py2.py3-none-any.whl
python 实现 观察者模式4(委托) python 实现 简单工厂模式 python 实现 命令模式 python 实现 模板方法模式 python 实现 桥接模式 python 实现 适配器模式 python 实现 外观模式 python 实现 原型模式 python 实现...
首先,在认识metaclass之前,你需要认识下python中的class。python中class的奇怪特性借鉴了smalltalk语言。大多数语言中,classes仅仅是用于描述怎样创建一个对象的代码端。在某种程度上说,python中的class也是这样...
集合分为可变集合和不可变集合,对于可变集合可以添加和删除集合元素,但其中的元素本身却是不可修改的,因此集合的元素只能是数值、字符串或元组。可变集合不能作为其他集合的元素或为字典的关键字使用,不可变集合...
可变形卷积网络的官方实现,Deformable Convolutional Networks
Python爬虫项目集合Python爬虫项目集合Python爬虫项目集合Python爬虫项目集合Python爬虫项目集合Python爬虫项目集合Python爬虫项目集合Python爬虫项目集合Python爬虫项目集合
特征选择方法中的Relief算法,利用python实现。可用于二分类标签的特征降维。