Python中的内部类(Inner Classes)

Python中的内部类(Inner Classes)

你可能听说过python中的嵌套函数。如果你知道嵌套函数的含义,那么你很容易就能理解嵌套类/内部类。

一、内部类/嵌套类

定义在某一个类的里面的类被称为内部类/嵌套类。请看如下所示的内部类/嵌套类的结构:

## 外部类
class Outer:
    ## 内部类
    class Inner:
        ## 多级内部类
        class InnerInner:
    ## 另一个内部类
    class _Inner:
    ## ...
    pass

二、为什么要使用内部类?

把两个或者多个类打包在一起。假设你有两个类Car和Engine。每一个Car都需要一个Engine,但是每一个Engine不会在没有Car的时候被使用。因此我们可以让Engine成为Car的内部类。这有助于我们保存代码。

嵌套类的另一个作用是隐藏代码。我们可以将嵌套类从外部世界中隐藏起来。

更有助于理解代码。嵌套类使得相关的类紧密联系在一起,我们不用在整个code文件中上下寻找使用到的类。

嵌套类或者内部类不是经常遭Python中使用的功能,但是它可以是我们在实现代码的时候的一个很好的功能。当你使用内部类/嵌套类的时候,代码组织起来会非常直接。

三、编写内部类

应用内部类/嵌套类并不困难。我们可以使用self关键词来访问内部类,这样我们就可以快速创建内部类的实例,并且根据需要在外部类中执行操作。但是,我们是不能在内部类中访问外部类的。让我们看一下下面的例子:

class Outer:
    """外部类"""
    def __init__(self):
        ## 实例化内部类
        self.inner = self.Inner()
    def reveal(self):
        ## calling the 'Inner' class function display
        self.inner.inner_display("Calling Inner class function from Outer class")
    class Inner:
        """内部类"""
        def inner_display(self, msg):
            print(msg)

现在,我们来创建外部类的实例,并调用它的reveal()方法来执行内部类的方法inner_display()。

## 创建外部类的实例对象
outer = Outer()
## 调用'reveal()'方法
outer.reveal()

让我们看看访问内部类的另一种方法,不过这种方式的效率相对低一些。

Outer().Inner().inner_display("Calling the Inner class method directly")

如果我们想摆脱外部类的控制,在运行的时候独立地创建一个内部类的实例对象,也是可以做到的。如下面的代码所示:

outer = Outer()
## 实例化内部类
inner = outer.Inner() ## inner = Outer().Inner() or inner = outer.inner
inner.inner_display("Just Print It!")

(一)多个内部类

“多个内部类”指的是同一个类中有多个内部类,和之前的应用方式差不多。

class Outer:
    """外部类"""
    def __init__(self):
        ## 实例化'Inner'类
        self.inner = self.Inner()
        ## 实例化'_Inner'类
        self._inner = self._Inner()
    def show_classes(self):
        print("This is Outer class")
        print(inner)
        print(_inner)
    class Inner:
        """第一个内部类"""
        def inner_display(self, msg):
            print("This is Inner class")
            print(msg)
    class _Inner:
        """第二个内部类"""
        def inner_display(self, msg):
            print("This is _Inner class")
            print(msg)
    ## ...

访问这些类的方法也是和之前一样的。如下面的代码所示:

## 实例化类
## 外部类
outer = Outer()
## 内部类
inner = outer.Inner() ## inner = outer.inner or inner = Outer().Inner()
## 第二个内部类
_inner = outer._Inner() ## _inner = outer._outer or _inner = Outer()._Inner()

调用方法

## 调用方法
outer.show_classes()

'Inner' class

inner.inner_display("Just Print It!")

'_Inner' class

_inner.inner_display("Just Show It!")

(二)多级内部类

在多级内部类中,一个被包含在其他类里面的内部类,它里面还可以再包含内部类。

class Outer:
    """外部类"""
    def __init__(self):
        ## 实例化内部类
        self.inner = self.Inner()
        ## 实例化多级内部类
        self.innerinner = self.inner.InnerInner()
    def show_classes(self):
        print("This is Outer class")
        print(inner)
    ## 内部类
    class Inner:
        """First Inner Class"""
        def __init__(self):
            ## 实例化'InnerInner'类
            self.innerinner = self.InnerInner()
        def show_classes(self):
            print("This is Inner class")
            print(self.innerinner)
        ## 多级内部类
        class InnerInner:
            def inner_display(self, msg):
                print("This is multilevel InnerInner class")
                print(msg)
        def inner_display(self, msg):