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):