Python subclassing a class with custom __new__

微笑、不失礼 提交于 2020-02-03 23:41:13

问题


There's a class (not created by me, from a 3rd party library) that has no __init__ declared (other than object's __init__), and this is its __new__:

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

I can't see why didn't they just use __init__ here, but they didn't.

Now I'd like to subclass this and give it an additional attribute; before I checked the source-code of the class (only the documentation), I thought it's just using __init__ like others, so here's what I did:

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

Apparently this raised a TypeError from object.__init__() not taking parameteres. How should I subclass such class with __new__? Do I just override the __new__ method to?


回答1:


Since the original project stuck with __new__ and using both __init__ and __new__ together in sub-classes can get very tricky indeed, you'll have to use __new__ in subclasses as well:

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

Perhaps the original author felt that the type should be treated as an immutable.

You can still use __init__ if you insist, but you'll have to specify a __new__ method anyway to account for the extra argument your __init__ now takes:

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


来源:https://stackoverflow.com/questions/28236516/python-subclassing-a-class-with-custom-new

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!