#!/usr/bin/env python
# -*- coding:utf-8 -*-
class Modle:
__name = "DNN"
def __init__(self, name): # 只需要传入name
self.__name = name
def print_name(self):
print(self.__name)
@classmethod
def print_cls_name(cls):
print(cls.__name)
class CNNModle(Modle):
__name = "CNN"
def __init__(self,name,layer_num): # 既需要传入name,还需要传入层数layer_num
Modle.__init__(self,name) #这行非常关键,没有这行代码就会报错,显式调用的意思
self.__layer_num = layer_num
def print_name(self):
print(self.__name)
self.print_layer_num()
def print_layer_num(self):
print("Layer Num",self.__layer_num)
class RNNModle(Modle):
__name = "RNN"
def __init__(self,name,nn_tpye):
Modle.__init__(self,name) #这行非常关键,没有这行代码就会报错,显式调用的意思
self.__nn_tpye = nn_tpye
def print_name(self):
print(self.__name)
self.print_nn_tpye()
def print_nn_tpye(self):
print("NN tpye:",self.__nn_tpye)
def print_modle(modle): #多态的实现,传入的是对象
#(这里的偏传统,python中真正的多态不要求来自一个继承树)
modle.print_name() #.调用传入modle的print_name()函数
def main():
modle = Modle("DNN")
cnnmodle = CNNModle("CNN",5)
rnnmodle = RNNModle("RNN","LSTM")
[print_modle(m) for m in [modle, cnnmodle, rnnmodle] ]
if __name__ == '__main__':
main()
输出:
要点:
1、多态的设计就是要完成对不同类型对象使用相同方法调用能得到各自期望的输出
2、在数据封装,继承和多态中,多态是python设计的核心,也叫鸭子类型