委托(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编程语言中,字典、集合和不可变集合是三种重要的数据结构,它们各自具有独特的特性和用途。本篇文章将深入探讨这些概念,并详细解释它们的赋值机制。 首先,我们来了解一下**字典(Dictionary)**。字典是...
- **不可变集合**:与Python的集合类似,但元素一旦添加,就不能再改变。 4. **不可变容器的优势**: - **性能优化**:不可变对象可以被缓存,因为知道它们不会改变,所以可以重用,减少了内存开销。 - **函数式...
### Python中的Metaclass元类创建与使用详解 #### 一、引言 在Python中,元类(Metaclass)是一个非常强大的概念,它允许我们控制类的行为和特性。通过使用元类,我们可以自定义类的创建过程,实现更加灵活和高级的...
"metaclass-1.0-py2.py3-none-any.whl"表明这个库兼容Python 2和3,而且是“none”平台特定的,这意味着它不包含任何特定操作系统相关的实现,可以在任何支持Python的平台上运行。 安装这个元类库的方法通常是通过...
集合中的元素必须是可hash的,即不可变的数据类型。 空集合 a=set() 注意a={}创建的是一个空字典。 set —— 可变集合。集合中的元素可以动态的增加或删除。 frozenset —— 不可变集合。集合中的元素不可改变。 注...
列表是可变的有序序列,元组是不可变的有序序列,字典是键值对的无序集合,集合是不重复元素的无序集合。理解它们的特点和操作方法是Python编程的基础。 5. **字符串操作** Python字符串是不可变的,但提供了丰富...
python实现按键精灵工具合集python实现按键精灵工具合集python实现按键精灵工具合集python实现按键精灵工具合集python实现按键精灵工具合集python实现按键精灵工具合集python实现按键精灵工具合集python实现按键精灵...
Python-Metar Python-metar是一个Python软件包,用于解释METAR和SPECI编码的天气报告。 METAR和SPECI是编码的航空天气报告。 官方编码方案在世界气象组织(WMO)编码手册A卷(I.1卷)(WMO-306 IiA)中进行了规定...
python 实现 观察者模式4(委托) python 实现 简单工厂模式 python 实现 命令模式 python 实现 模板方法模式 python 实现 桥接模式 python 实现 适配器模式 python 实现 外观模式 python 实现 原型模式 python 实现...
集合分为可变集合和不可变集合,对于可变集合可以添加和删除集合元素,但其中的元素本身却是不可修改的,因此集合的元素只能是数值、字符串或元组。可变集合不能作为其他集合的元素或为字典的关键字使用,不可变集合...
不能是列表、字典和集合等可变数据类型;创建集合的方式很简单,只需将逗号分隔的不同元素使用大括号括起来即可。由于集合元素是无序的,集合的打印效果与定义顺序可以不一致,且由于集合元素独一无二,使用集合类型...
特征选择方法中的Relief算法,利用python实现。可用于二分类标签的特征降维。
### 详解Python单例模式与Metaclass #### 单例模式概述 单例模式是一种常用的软件设计模式,它确保一个类只有一个实例,并提供一个全局访问点。这种模式在某些情况下非常有用,比如当应用程序需要控制资源访问时...
### Python 中 Meta Classes详解 #### 元类概览与起源 元类,或者说是Meta Classes,在Python编程领域中扮演着非常特殊的角色。它们是类的类,或者说是一种用来定义类本身的类。理解元类的前提是对Python中的类有...
Python中,数值类型(int和float)、字符串str、元组tuple都是不可变类型。而列表list、字典dict、集合set是可变类型。 还是看代码比较直观。先看不可变对象 不可变对象的例子 先说明一点is 就是判断两
在"Python语法:集合.mp4"视频中,你可以期待涵盖这些基本概念以及更高级的集合用法,例如集合推导式、集合的更新方法(update()、add()、remove()等)和集合的内置函数(如frozenset()用于创建不可变集合)。...
在Python中,我们可以使用各种库来实现Modbus通信,其中一个常见的库是`pyModbusTCP`,这也是压缩包文件`pyModbusTCP-master`所包含的内容。 在深入探讨Python实现Modbus TCP通信之前,我们先理解一下Modbus的基本...
使用python实现了可视域计算的几种经典算法,包括LOS算法,Xdraw算法,参考面算法等