2013-10-08 52 views
2

我有以下的代碼示例,Python中使用別名內部類

class Outer: 
    class InnerException(Exception): pass 
    def raise_inner(self): 
     raise Outer.InnerException() 
    def call_raise(self): 
     try: 
      self.raise_inner() 
     except Outer.InnerException as e: 
      print "Handle me" 

Outer().call_raise() 

我希望做的是不是使用Outer.InnerException只是使用InnerException外部類的內部,在短期是這樣

class Outer: 
    class InnerException(Exception): pass 

    #InnerException = Outer.InnerException .. something like this, create some alias 

    def raise_inner(self): 
     raise InnerException() 
    def call_raise(self): 
     try: 
      self.raise_inner() 
     except InnerException as e: 
      print "Handle me" 

Outer().call_raise() 
+4

Python中的常用方法:將異常類放在模塊範圍內。 –

+0

查看關於Python的[LEGB作用域規則](http://stackoverflow.com/a/292502/355230)的答案。 – martineau

回答

3

您不能只引用在類作用域中聲明的名稱(除非您在類作用域中也這樣做)。

要麼是:

class Outer: 
    class InnerException(Exception): pass 
    def raise_inner(self): 
     raise self.InnerException() 

class InnerException(Exception): pass 
class Outer: 
    def raise_inner(self): 
     raise InnerException() 
1

在調用方法時查找名稱InnerException,所以異常名稱是非本地值。你可以寫

class Outer: 
    class InnerException(Exception): pass 

    # methods 

InnerException = Outer.InnerException 

但大多失敗擺在首位定義InnerExceptionOuter內的目的。你可以很容易地編寫

class Outer: 
    # methods 

class InnerException(Exception): pass 

因爲兩者使名稱InnerException是指異常的模塊範圍(儘管在第二種情況下,InnerException不再是Outer class屬性,當然)。

1

我想你可以做這樣的事情每個功能的封閉的範圍,它創建了一個局部變量是它的別名中定義它:

class Outer: 
    class InnerException(Exception): pass 
    def raise_inner(self, InnerException=InnerException): 
     raise InnerException() 
    def call_raise(self, InnerException=InnerException): 
     try: 
      self.raise_inner() 
     except InnerException as e: 
      print "Handle me" 

Outer().call_raise()