gpt4 book ai didi

具有字符串和第二类的 __new__ 和 __init__ 的 Python 多重继承

转载 作者:太空狗 更新时间:2023-10-30 01:29:32 24 4
gpt4 key购买 nike

我正在尝试创建一个继承自 str 类型和第二个类的派生类。这是有问题的,因为 str 类型不只是调用 __init__,而是调用 __new__ 方法,因为它的不可变性。我知道要使 __init__ 和 super 正常工作,您需要一直保持相同的调用结构。但是以下实现失败:

class base(object):
def __new__(cls, *args, **kwargs):
print "NEW BASE:", cls, args, kwargs
return super(base, cls).__new__(cls, *args, **kwargs)

def __init__(self, *args, **kwargs):
print "INIT BASE", args, kwargs

class foo(base, str):
def __new__(cls, *args, **kwargs):
return super(foo, cls).__new__(cls, *args, **kwargs)

def __init__(self, *args, **kwargs):
super(foo, self).__init__(*args, **kwargs)

此处 foo('cat') 适用于:

>> NEW  BASE: <class '__main__.foo'> ('cat',) {}
>> INIT BASE ('cat',) {}

但是对于参数 foo('cat', x=3),它失败了:

>> NEW  BASE: <class '__main__.foo'> ('cat',) {'x': 3}
Traceback (most recent call last):
File "inh.py", line 19, in <module>
foo('cat', x=3)
File "inh.py", line 12, in __new__
return super(foo, cls).__new__(cls, *args, **kwargs)
File "inh.py", line 4, in __new__
return super(base, cls).__new__(cls, *args, **kwargs)
TypeError: str() takes at most 1 argument (2 given)

可以通过将 base.__new__ 方法更改为:

def __new__(cls, *args, **kwargs):
return super(base, cls).__new__(cls)

但现在我已经更改了调用结构,我觉得这会在以后给我带来问题。

我如何正确地继承字符串和第二个类

最佳答案

你不能只做

def __new__(cls, *args, **kwargs):
return super(base, cls).__new__(cls)

因为这会导致对 str 的 new 的错误调用(你不会传递允许的参数

>>> foo('t')
NEW BASE: <class '__main__.foo'> ('t',) {}
INIT BASE ('t',) {}
''

你应该做类似的事情

def __new__(cls, *args, **kwargs):
return super(base, cls).__new__(cls, *args[:1])

但是,如果您将使用 base 类作为 __new__ 方法接受多个参数的类的 mixin,这可能会破坏某些东西。

作为一个选项,也许您应该从 str 继承类,但使用重写的 new 方法:

class CarelessStr(str):
def __new__(cls, *args, **kwargs):
return super(CarelessStr, cls).__new__(cls, *args[:1])

class foo(base, CarelessStr):
def __new__(cls, *args, **kwargs):
return super(foo, cls).__new__(cls, *args, **kwargs)

def __init__(self, *args, **kwargs):
super(foo, self).__init__(*args, **kwargs)

关于具有字符串和第二类的 __new__ 和 __init__ 的 Python 多重继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16843158/

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