Python 使用多个_init__参数对元组进行子类化

Python 使用多个_init__参数对元组进行子类化,python,inheritance,subclass,tuples,Python,Inheritance,Subclass,Tuples,以下代码起作用: class Foo(tuple): def __init__(self, b): super(Foo, self).__init__(tuple(b)) if __name__ == '__main__': print Foo([3, 4]) $ python play.py 结果: play.py:4:DeprecationWarning:object.\uuu init\uuu()不接受任何参数 超级(Foo,self).\uuuu

以下代码起作用:

class Foo(tuple):

    def __init__(self, b):
        super(Foo, self).__init__(tuple(b))

if __name__ == '__main__':
    print Foo([3, 4])

$ python play.py 
结果:

play.py:4:DeprecationWarning:object.\uuu init\uuu()不接受任何参数
超级(Foo,self).\uuuu初始化(元组(b))
(3, 4)
但不包括以下内容:

class Foo(tuple):

    def __init__(self, a, b):
        super(Foo, self).__init__(tuple(b))

if __name__ == '__main__':
    print Foo(None, [3, 4])

$ python play.py 
结果:

回溯(最近一次呼叫最后一次):
文件“play.py”,第7行,在
打印Foo(无[3,4])
TypeError:tuple()最多接受1个参数(给定2个)

为什么?

因为元组是不可变的,所以您必须重写
\uuuuu new\uuuu

object.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

调用以创建的新实例 类
cls
<代码>\uuuu new\uuuuu()是一个静态 方法(特殊情况,因此不需要 声明它是这样的)接受 类的实例 请求作为其第一个参数。这个 剩下的参数是通过的参数 到对象构造函数表达式 (对班级的呼唤)。回归
\uuuu new\uuuu()
的值应为新值 对象实例(通常是实例 属于
cls

典型的实现创建了一个新的 通过调用 超类的
\uuuu new\uuuu()
方法使用
super(currentclass,cls)。\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu(cls[,…])
带有适当的参数和 然后修改新创建的 返回前根据需要执行实例 它

如果
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
cls
,然后新实例的
\uuuu init\uuuu()
方法将像调用
\uuuuu init\uuuuu(self[,…])
一样被调用,其中self是新实例和剩余实例 参数与传递的参数相同 到
\uuuu new\uuuu()

如果
\uuuu new\uuuu()
未返回
cls
的实例,然后 实例的
\uuuu init\uuuu()方法将不会
被调用

\uuuuuuuuuuuuuuuuuuuuo()
主要用于允许不可变类型的子类(如
int
str
tuple
)进行自定义 实例创建。这也是常见的 在中的自定义元类中重写 以自定义类创建


要指定元组值,您需要覆盖
\uuuu new\uuu
方法:

class Foo(tuple):

    def __new__ (cls, a, b):
        return super(Foo, cls).__new__(cls, tuple(b))
tuple类的
\uuuu init\uuuu
实现似乎忽略了这些参数,但如果需要执行一些init操作,可以按如下方式执行:

class Foo(tuple):

    def __new__ (cls, a, b):
        return super(Foo, cls).__new__(cls, tuple(b))

    def __init__(self, a, b):
        self.a=a
        self.b=b

if __name__ == '__main__':
    foo = Foo(None, [3, 4])
    print foo
    print foo.a
    print foo.b

有人能告诉我如何引用整个块,使双下划线不表示粗体吗?选择整个粘贴的文本并单击引号图标(文本框顶部的黑色图标)。我将它们全部替换为_;