我想创建OpenerDirector的子类。获得一个的正常方式是
opener = urllib2.build_opener(handler, ...) - python 2.x
opener = urllib.request.build_opener( ...) - python 3.x
我首先尝试通过
在我的子类中使用__new__
class MyOpener(OpenerDirector):
def __new__(cls, param1, param2):
# init myHandler
opener = build_opener(myHandler)
# further initialization
return opener
虽然有效但type(MyOpener(param1, param2))
为OpenerDirector
而非MyOpener
......至少令人困惑......
然后我试着猜测build_opener可以做什么并使用简单的__init__
class MyOpener(OpenerDirector):
def __init__(self, param1, param2):
OpenerDirector.__init__()
# init myHandler
opener = build_opener(myHandler)
for h in opener.handlers:
self.add_handler(h)
# further initialization
它有正确的类型,似乎工作正常,但我担心它是一个依赖于实现的解决方案,不会很好......
修改
事实上,添加处理程序是不够的:对象没有完全初始化并且无法使用。
END_EDIT
我知道防弹解决方案是在我的子类中有一个OpenerDirector属性,并简单地将所有OpenerDirector属性和方法委托给它(我会在c ++或java中做什么)但是我会有很多样板代码喜欢用脚本语言来避免。
所以__new__
解决方案(第一个)将是我的首选,如果我能找到一种方法将OpenerDirector对象转换为MyOpener对象,如perl中的bless
,但我没有'找不到任何东西。
有人知道Python中的显式转换吗?
答案 0 :(得分:1)
试试这个:
class MyOpener(OpenerDirector):
def __new__(cls, param1, param2):
# init myHandler
opener = build_opener(myHandler)
opener.__class__ = MyOpener
# further initialization
return opener