specialpython_如何在Python中自动委托__special_methods__?

这篇博客探讨了如何使用元类和代理方法来动态地为对象创建部分接口实现。通过示例展示了如何利用`Proxier`元类,将`Spam`类与`dict`和`list`的特定方法进行交互,如`__getitem__`、`__contains__`和`append`,而无需直接继承这些类型。这种方法在某些场景下可以提供灵活的接口定制。
摘要由CSDN通过智能技术生成

这看起来像......一个元类的工作!

def make_method(p, m):

def method(self, *a, **k):

return getattr(getattr(self, p),m)(*a, **k)

return method

class Proxier(type):

def __new__(cls, name, bases, dict):

objs = dict.get('proxyobjs', [])

if objs:

old_init = dict.get('__init__', lambda self: None)

def new_init(self, *a, **k):

for (n,v) in objs.iteritems():

setattr(self, n, v())

old_init(self, *a, **k)

dict['__init__'] = new_init

meths = dict.get('proxymethods', {})

for (proxyname, methnames) in meths.iteritems():

for methname in methnames:

dict[methname] = make_method(proxyname, methname)

return super(Proxier, cls).__new__(cls, name, bases, dict)

class Spam(object):

__metaclass__ = Proxier

proxyobjs = {'ham': dict,

'eggs': list,

}

proxymethods = {'ham': ('__setitem__', '__getitem__', '__delitem__'),

'eggs': ('__contains__', 'append')

}有用!

In [28]: s = Spam()

In [29]: s[4] = 'hi'

In [30]: s.append(3)

In [31]: 3 in s

Out[31]: True

In [32]: 4 in s

Out[32]: False

In [33]: s[4]

Out[33]: 'hi'请注意,您必须指定您正在使用的接口的哪些部分(否则,为什么不继承?)。所以我们来自list的__contains__和来自dict的__getitem__,以及来自两者的__iter__。 (并且只有一种方法可以改变基础列表,使用append而不是extend或__delitem__。)所以(像火星人)我不确定这将是多么有用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值