如何包装类的方法? [英] How to wrap a class's methods?
问题描述
我想子类化一个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屋!