gpt4 book ai didi

子类化 OpenerDirector 的 Pythonic 方式

转载 作者:太空宇宙 更新时间:2023-11-04 06:02:50 25 4
gpt4 key购买 nike

我想创建一个 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 属性和方法委托(delegate)给它(我会在 c++ 或 java 中做的事情)但是有很多样板代码我会喜欢避免使用脚本语言。

所以 __new__ 解决方案(第一个)将是我的首选,如果我能找到一种方法将 OpenerDirector 对象转换为 MyOpener 对象,比如 bless perl,但我没有找到任何东西。

有人知道 Python 中的显式转换吗?

最佳答案

试试这个:

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

关于子类化 OpenerDirector 的 Pythonic 方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23878468/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com