Python为内部类使用别名

时间:2013-10-08 16:19:23

标签: 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而只是在Outer类中使用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()

3 个答案:

答案 0 :(得分: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 :(得分:1)

在调用方法时查找名称InnerException,因此异常名称是非本地值。你可以写

class Outer:
    class InnerException(Exception): pass

    # methods

InnerException = Outer.InnerException

但这首先违背了在InnerException类中定义Outer的目的。你可以轻松地写

class Outer:
    # methods

class InnerException(Exception): pass

因为两者都使名称InnerException引用模块范围中的异常(尽管在第二种情况下,InnerException不再是Outer的类属性,当然)。

答案 2 :(得分: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()