2014-02-26 37 views
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都快乐?

回答

1

最好的办法是在这里使用异常处理:

def __init__(self,text,begin,end,*args,**kargs): 
    try: 
     super(Token,self).__init__(*args,**kargs) 
    except TypeError: 
     # Python 3 and the mixed in type is immutable. 
     # Ignoring this is fine, `__new__` took care of this. 
     pass 
    self.text = text 
    self.begin = begin 
    self.end = end 
+0

谢谢你,它的伟大工程!然而,我有点困惑......即使混合类型是不可变的,虚拟'__init__'不应该考虑额外的参数吗?为什么会有TypeError? – math4tots

+0

@ math4tots:可变类型有一个'__init__'方法,不可变类型不会。所以'list .__ init__'存在,'unicode .__ init__'不存在。这意味着对于不可变类型,调用'object .__ init__'。在Python 2和3之间,对象.__ init__'接受的规则已经改变。 –

+1

请参阅[在这三种情况下为什么object \ \ _ _ new \ _ \ _工作方式不同](http://stackoverflow.com/ q/19277399)那里的细节。 –