如何包装类的方法? [英] How to wrap a class's methods?

查看:77
本文介绍了如何包装类的方法?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想子类化一个IMAP连接,以便大多数

方法在返回状态不正常时引发异常。

这个有效,但必须有一种方法可以做到这一点并没有b $ b涉及如此多的重复:


类MyImap4_ssl(imaplib。 IMAP4_SSL):


def登录(* args):

s,r = imaplib.IMAP4_SSL.login(* args)

if s!=''OK'':

加注NotOK((s,r))

返回r


def list(* args):

s,r = imaplib.IMAP4_SSL.list(* args)

if s!=''OK'':

加注NotOK((s,r))

返回r

def搜索(* args):

s,r = imaplib.IMAP4_SSL.search(* args)

if s!=''OK'':

加注NotOK((s,r))

返回r


[等等另外十几种方法]


-

Grant Edwards你好!我在HIPPOS拥有6粉红色

!!

visi.com

I want to subclass an IMAP connection so that most of the
methods raise an exception if the returned status isn''t ''OK''.
This works, but there''s got to be a way to do it that doesn''t
involve so much duplication:

class MyImap4_ssl(imaplib.IMAP4_SSL):

def login(*args):
s,r = imaplib.IMAP4_SSL.login(*args)
if s!=''OK'':
raise NotOK((s,r))
return r

def list(*args):
s,r = imaplib.IMAP4_SSL.list(*args)
if s!=''OK'':
raise NotOK((s,r))
return r

def search(*args):
s,r = imaplib.IMAP4_SSL.search(*args)
if s!=''OK'':
raise NotOK((s,r))
return r

[and so on for another dozen methods]

--
Grant Edwards grante Yow! I OWN six pink
at HIPPOS!!
visi.com

推荐答案

Grant Edwards写道:
Grant Edwards wrote:
我想子类化一个IMAP连接,以便大多数
方法如果返回的状态不正常则引发异常。
这是有效的,但必须有一种方法可以做到这一点,并没有涉及如此多的重复:

类MyImap4_ssl(imaplib.IMAP4_SSL):

def登录(* args):
s,r = imaplib.IMAP4_SSL.login(* args)
如果s!=''确定'':
加注NotOK((s, r))
返回r

def list(* args):
s,r = imaplib.IMAP4_SSL.list(* args)
if s!=' 'OK'':
加注NotOK((s,r))
返回r

def搜索(* args):
s,r = imaplib.IMAP4_SSL .search(* args)
if s!=''OK'':
加注NotOK(( s,r))
返回r

[等等另外十几种方法]
I want to subclass an IMAP connection so that most of the
methods raise an exception if the returned status isn''t ''OK''.
This works, but there''s got to be a way to do it that doesn''t
involve so much duplication:

class MyImap4_ssl(imaplib.IMAP4_SSL):

def login(*args):
s,r = imaplib.IMAP4_SSL.login(*args)
if s!=''OK'':
raise NotOK((s,r))
return r

def list(*args):
s,r = imaplib.IMAP4_SSL.list(*args)
if s!=''OK'':
raise NotOK((s,r))
return r

def search(*args):
s,r = imaplib.IMAP4_SSL.search(*args)
if s!=''OK'':
raise NotOK((s,r))
return r

[and so on for another dozen methods]




您可以尝试类似的东西(未经测试!):


类Wrapper(对象):

def __init __(self,func):

self.func = func

def __call __(* args,** kwargs):

self,args = args [0],args [1:]

s ,r = self.func(* args)

if s!=''OK'':

加注NotOK((s,r))

返回r


for func_name in [''login'',''list'',''search'']:

func =包装器(getattr(imaplib.IMAP4_SSL,func_name))

setattr(imaplib.IMAP4_SSL,func_name,func)


STeVe



You could try something like (Untested!):

class Wrapper(object):
def __init__(self, func):
self.func = func
def __call__(*args, **kwargs):
self, args = args[0], args[1:]
s, r = self.func(*args)
if s != ''OK'':
raise NotOK((s, r))
return r

for func_name in [''login'', ''list'', ''search'']:
func = Wrapper(getattr(imaplib.IMAP4_SSL, func_name))
setattr(imaplib.IMAP4_SSL, func_name, func)

STeVe


Grant Edwards写道:
Grant Edwards wrote:
我想继承一个IMAP连接,这样如果返回的状态不好,大多数
方法会引发异常''。
这有效,但必须有办法做到这一点oesn'n
涉及如此多的重复:

类MyImap4_ssl(imaplib.IMAP4_SSL):

def login(* args):
s, r = imaplib.IMAP4_SSL.login(* args)
如果s!=''确定'':
加注NotOK((s,r))
返回r

def list(* args):
s,r = imaplib.IMAP4_SSL.list(* args)
if s!=''OK'':
加注NotOK((s, r))
返回r
def搜索(* args):
s,r = imaplib.IMAP4_SSL.search(* args)
if s!=' 'OK'':
加注NotOK((s,r))
返回r

[等等另外十几种方法]
I want to subclass an IMAP connection so that most of the
methods raise an exception if the returned status isn''t ''OK''.
This works, but there''s got to be a way to do it that doesn''t
involve so much duplication:

class MyImap4_ssl(imaplib.IMAP4_SSL):

def login(*args):
s,r = imaplib.IMAP4_SSL.login(*args)
if s!=''OK'':
raise NotOK((s,r))
return r

def list(*args):
s,r = imaplib.IMAP4_SSL.list(*args)
if s!=''OK'':
raise NotOK((s,r))
return r

def search(*args):
s,r = imaplib.IMAP4_SSL.search(*args)
if s!=''OK'':
raise NotOK((s,r))
return r

[and so on for another dozen methods]




我的其他电子邮件的更经过测试的版本:


py> C级(对象):

.... def f(self,* args):

.... print" f:",args

.... def g(self,* args):

.... print" g:",args

.. ..

py> D级(C):

....传递

....

py> class Wrapper(object):

.... def __init __(self,func):

.... self.func = func

.... def __call __(self,* args):

.... print" wrapped"

.... return self.func(* args )

....

py>对于[''f'',''g'']中的名称:

.... wrapper = Wrapper(getattr(C,name))

.. .. setattr(D,name,new.instancemethod(wrapper,None,D))

....

py> C()。f()

f :()

py> C()。g(1)

g:(1,)

py> D()。f()

包裹

f :()

py> D()。g(1)

包裹

g:(1,)



A more tested version of my other email:

py> class C(object):
.... def f(self, *args):
.... print "f:", args
.... def g(self, *args):
.... print "g:", args
....
py> class D(C):
.... pass
....
py> class Wrapper(object):
.... def __init__(self, func):
.... self.func = func
.... def __call__(self, *args):
.... print "wrapped"
.... return self.func(*args)
....
py> for name in [''f'', ''g'']:
.... wrapper = Wrapper(getattr(C, name))
.... setattr(D, name, new.instancemethod(wrapper, None, D))
....
py> C().f()
f: ()
py> C().g(1)
g: (1,)
py> D().f()
wrapped
f: ()
py> D().g(1)
wrapped
g: (1,)


2005-02- 17,Steven Bethard< st ************ @ gmail.com>写道:
On 2005-02-17, Steven Bethard <st************@gmail.com> wrote:
py> C级(对象):
... def f(self,* args):
... print" f:",args
... def g(self, * args):
... print" g:",args
...
py> D级(C):
...传递
...
py> class Wrapper(object):
... def __init __(self,func):
... self.func = func
... def __call __(self,* args):
... print" wrapped"
... return self.func(* args)
...
py>对于[''f'',''g'']中的名称:
... wrapper = Wrapper(getattr(C,name))
... setattr(D,name,new。 instancemethod(包装,无,D))
py> class C(object):
... def f(self, *args):
... print "f:", args
... def g(self, *args):
... print "g:", args
...
py> class D(C):
... pass
...
py> class Wrapper(object):
... def __init__(self, func):
... self.func = func
... def __call__(self, *args):
... print "wrapped"
... return self.func(*args)
...
py> for name in [''f'', ''g'']:
... wrapper = Wrapper(getattr(C, name))
... setattr(D, name, new.instancemethod(wrapper, None, D))




谢谢。由新提供的东西。模块是我的原因

缺失。


-

Grant Edwards grante哇!等等......这是一个乐趣

在THING或生命结束时

visi.com Petticoat Junction ??



Thanks. The stuff provided by the "new" module is what I was
missing.

--
Grant Edwards grante Yow! Wait... is this a FUN
at THING or the END of LIFE in
visi.com Petticoat Junction??

这篇关于如何包装类的方法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆