gpt4 book ai didi

Python 使用自定义 __new__ 子类化一个类

转载 作者:行者123 更新时间:2023-11-28 20:43:48 25 4
gpt4 key购买 nike

有一个类(不是我创建的,来自第 3 方库)没有声明 __init__(除了 object__init__),这是它的 __new__:

def __new__(cls, uid):
self = super().__new__(cls, uid)
self._info = get_info_from_uid(uid)
return self

我不明白他们为什么不在这里使用 __init__,但他们没有。

现在我想继承它并给它一个额外的属性;在我检查类的源代码(仅文档)之前,我认为它只是像其他人一样使用 __init__,所以这就是我所做的:

class MyClass(TheirClass):
def __init__(self, uid, my_stuff=()):
super().__init__(uid)
self.my_stuff = my_stuff

显然这从 object.__init__() 中引发了一个 TypeError 没有接受参数。我应该如何使用 __new__ 子类化这样的类?我是否只是将 __new__ 方法重写为?

最佳答案

由于原始项目坚持使用 __new__ 并在子类中同时使用 __init____new__ can get very tricky indeed ,您还必须在子类中使用 __new__:

class MyClass(TheirClass):
def __new__(cls, uid, my_stuff=()):
self = super().__new__(cls, uid)
self.my_stuff = my_stuff
return self

也许原作者认为类型应该被视为不可变。

如果你坚持,你仍然可以使用 __init__,但是你必须指定一个 __new__ 方法 anyway 来解释额外的参数你的 __init__ 现在需要:

class MyClass(TheirClass):
def __new__(cls, uid, *args):
# ignore the extra arguments
return super().__new__(cls, uid)

def __init__(self, uid, my_stuff=()):
self.my_stuff = my_stuff

关于Python 使用自定义 __new__ 子类化一个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28236516/

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