0
我有一些代码如下所示:子类内建类型 - Python 2和3
class Token(object):
'''
Resulting from parse
'''
def __new__(cls,text,begin,end,*args,**kargs):
self = super(Token,cls).__new__(cls,*args,**kargs)
return self
def __init__(self,text,begin,end,*args,**kargs):
super(Token,self).__init__(*args,**kargs)
self.text = text
self.begin = begin
self.end = end
class List(Token,list):
pass
class Str(Token,str):
pass
class Int(Token,int):
pass
s = Str('hey there',0,3,'hey there'[0:3])
print(s)
x = Int('55 12',0,2,'55 12'[0:2])
print(x)
基本上就是我想要做的就是轻松地创建只是普通的Python类型的类型,但也有一些额外的信息给他们。
的Python 2似乎与上面的代码行,但是Python 3抱怨
Traceback (most recent call last):
File "simple.py", line 71, in <module>
s = Str('',1,2,'hey')
File "simple.py", line 12, in __init__
super(Token,self).__init__(*args,**kargs)
TypeError: object.__init__() takes no parameters
我想,如果我不喜欢的东西
class List(list):
def __init__(self,text,begin,end,*args,**kargs):
list.__init__(*args,**kargs)
口译员将很高兴但是这将意味着我将不得不重复类似的每一个新的类我想做...我宁愿保持相对干...
是否有一个'正确'的方式,我应该处理这种情况让Python 2和Python 3都快乐?
谢谢你,它的伟大工程!然而,我有点困惑......即使混合类型是不可变的,虚拟'__init__'不应该考虑额外的参数吗?为什么会有TypeError? – math4tots
@ math4tots:可变类型有一个'__init__'方法,不可变类型不会。所以'list .__ init__'存在,'unicode .__ init__'不存在。这意味着对于不可变类型,调用'object .__ init__'。在Python 2和3之间,对象.__ init__'接受的规则已经改变。 –
请参阅[在这三种情况下为什么object \ \ _ _ new \ _ \ _工作方式不同](http://stackoverflow.com/ q/19277399)那里的细节。 –