委托(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编程语言中,字典、集合和不可变集合是三种重要的数据结构,它们各自具有独特的特性和用途。本篇文章将深入探讨这些概念,并详细解释它们的赋值机制。 首先,我们来了解一下**字典(Dictionary)**。字典是...
本文实例讲述了Python使用metaclass实现Singleton模式的方法。分享给大家供大家参考。具体实现方法如下: class Singleton(type): def __call__(cls, *args, **kwargs): print "Singleton call" if not hasattr...
- **不可变集合**:与Python的集合类似,但元素一旦添加,就不能再改变。 4. **不可变容器的优势**: - **性能优化**:不可变对象可以被缓存,因为知道它们不会改变,所以可以重用,减少了内存开销。 - **函数式...
"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-Metar Python-metar是一个Python软件包,用于解释METAR和SPECI编码的天气报告。 METAR和SPECI是编码的航空天气报告。 官方编码方案在世界气象组织(WMO)编码手册A卷(I.1卷)(WMO-306 IiA)中进行了规定...
不能是列表、字典和集合等可变数据类型;创建集合的方式很简单,只需将逗号分隔的不同元素使用大括号括起来即可。由于集合元素是无序的,集合的打印效果与定义顺序可以不一致,且由于集合元素独一无二,使用集合类型...
可变形卷积网络的官方实现,Deformable Convolutional Networks
特征选择方法中的Relief算法,利用python实现。可用于二分类标签的特征降维。
基于Java和Python实现的函数,用于计算实数集合的和.zip 基于Java和Python实现的函数,用于计算实数集合的和.zip 基于Java和Python实现的函数,用于计算实数集合的和.zip 基于Java和Python实现的函数,用于计算实数...
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中,数值类型(int和float)、字符串str、元组tuple都是不可变类型。而列表list、字典dict、集合set是可变类型。 还是看代码比较直观。先看不可变对象 不可变对象的例子 先说明一点is 就是判断两
提问者自称已经掌握了有关Python OOP编程中的各种概念,但始终觉得元类(metaclass)难以理解。他知道这肯定和自省有关,但仍然觉得不太明白,希望大家可以给出一些实际的例子和代码片段以帮助理解,以及在什么情况下...
在python中用turtle库画小猪佩奇
这样,我们就利用Python C API实现了不可变字典的效果。 3. 使用`collections.frozendict` 在Python标准库的`collections`模块中,已经提供了一个不可变字典的实现——`frozendict`。`frozendict`类创建的对象类似...
使用python实现了可视域计算的几种经典算法,包括LOS算法,Xdraw算法,参考面算法等