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