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
有一个 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