Python 使用自定义 __new__ 子 class class

Python subclassing a class with custom __new__

有一个 class(不是我创建的,来自第 3 方库)没有声明 __init__object__init__ 除外),这是它的 __new__:

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

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

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

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

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

由于原始项目坚持使用 __new__ 并在子 类 can get very tricky indeed 中同时使用 __init____new__,您将不得不在 sub类 中也使用 __new__

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

可能是原作者觉得应该把类型当做不可变来处理吧

如果您坚持,您仍然可以使用 __init__,但是您必须指定一个 __new__ 方法 无论如何 来说明您的额外参数__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