Python的多态

#!/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设计的核心,也叫鸭子类型

Python 多态(Polymorphism)是面向对象编程中的一个重要概念,它允许不同的对象对同一方法调用产生不同的行为。在 Python 中,多态主要通过**方法重写(Method Overriding)**和**鸭子类型(Duck Typing)**来实现。 ### 1. **多态的实现方式** - **方法重写(继承多态)**:子类可以重写父类的方法,使得不同的子类对象调用相同的方法时表现出不同的行为。 - **鸭子类型(Duck Typing)**:Python 不关心对象的类型,而是关注对象是否具有某个方法或行为。如果对象的行为符合预期,就可以调用对应的方法。 ### 2. **示例代码** ```python class Animal: def speak(self): pass class Dog(Animal): def speak(self): return "Woof!" class Cat(Animal): def speak(self): return "Meow!" def make_sound(animal): print(animal.speak()) # 不同的对象调用相同的方法,产生不同的行为 dog = Dog() cat = Cat() make_sound(dog) # 输出 "Woof!" make_sound(cat) # 输出 "Meow!" ``` **鸭子类型示例**: ```python class Duck: def quack(self): return "Quack!" class Person: def quack(self): return "I can quack like a duck!" def sound_maker(obj): print(obj.quack()) duck = Duck() person = Person() sound_maker(duck) # 输出 "Quack!" sound_maker(person) # 输出 "I can quack like a duck!" ``` ### 3. **Python 多态的特点** - 不需要显式继承接口或抽象类。 - 动态语言特性使得多态更加灵活。 - 适用于任何具有相同方法的对象,即使它们没有继承关系。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值