Pythonic方式的子类化OpenerDirector

时间:2014-05-26 22:27:26

标签: python

我想创建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中的显式转换吗?

1 个答案:

答案 0 :(得分:1)

试试这个:

class MyOpener(OpenerDirector):
    def __new__(cls, param1, param2):
        # init myHandler
        opener = build_opener(myHandler)
        opener.__class__ = MyOpener
        # further initialization
        return opener
相关问题