【python之路】【之前没搞明白】5面向对象(多态)

多态

有时一个对象会有多种表现形式,比如网站页面有个button按钮, 这个button的设计可以不一样(单选框、多选框、圆角的点击按钮、直角的点击按钮等),尽管长的不一样,但它们都有一个共同调用方式,就是onClick()方法。我们直要在页面上一点击就会触发这个方法。点完后有的按钮会变成选中状态、有的会提交表单、有的甚至会弹窗。这种多个对象共用同一个接口,又表现的形态不一样的现象,就叫做多态( Polymorphism )。

Polymorphism is based on the greek words Poly (many) and morphism (forms).

接下来我们通过代码来演示什么是多态。

通过统一函数接口实现多态

class Dog(object):
    def sound(self):
        print("汪汪汪.....")
class Cat(object):
    def sound(self):
        print("喵喵喵.....")
def make_sound(animal_type):
    """统一调用接口"""
    animal_type.sound() # 不管你传进来是什么动物,我都调用sound()方法
dogObj = Dog()
catObj = Cat()
make_sound(dogObj)
make_sound(catObj)

通过抽象类实现多态(最常用)

假如你开发一个文本编辑器,支持多种文档类型, 在用户通过你的编辑器打开文件之前,你也不知道准备要打开的是什么类型的文件,可能是pdf,也可能是word.

假如你为每个文件类型都写一个类,每个类都通过show()方法来调用打开对应的文档,为了确保每个类都必须实现show()方法,你可以写一个抽象类。

class Document:
      def __init__(self, name):
        self.name = name
      def show(self):
        raise NotImplementedError("Subclass must implement abstract method")     # 设计架构时,添加这句话,继承父类的子类里面都需要重写这个方法,不然报错
class Pdf(Document):
    def show(self):#重写show()
        return ‘Show pdf contents!‘
class Word(Document):
    def show(self):#重写show()
        return ‘Show word contents!‘
documents = [Pdf(‘Document1‘),
             Pdf(‘Document2‘),
             Word(‘Document3‘)]
for document in documents:
    print(document.name + ‘: ‘ + document.show())

再来一个例子:

class Car:
    def __init__(self, name):
        self.name = name
    def drive(self):
        raise NotImplementedError("Subclass must implement abstract method")
    def stop(self):
        raise NotImplementedError("Subclass must implement abstract method")

class SportsCar(Car):
    def drive(self):
        return ‘Sportscar driving!‘
    def stop(self):
        return ‘Sportscar braking!‘

class Truck(Car):
    def drive(self):
        return ‘Truck driving slowly because heavily loaded.‘
    def stop(self):
        return ‘Truck braking!‘
cars = [Truck(‘东风重卡‘),
        Truck(‘三一重工‘),
        SportsCar(‘Tesla Roadster‘)]
for car in cars:
    print(car.name + ‘: ‘ + car.drive())

原文地址:https://www.cnblogs.com/watalo/p/12327079.html

时间: 2024-10-02 10:59:45

【python之路】【之前没搞明白】5面向对象(多态)的相关文章

没搞明白fileinput模块的inplace!

__author__ = 'sophi' import fileinput product_list = [] f = open("porduct.txt","r",encoding="utf-8") #打开文件 for line in f.readlines(): line = line.strip() index,item = line.split(":") #冒号分割 product_list.append((index

【python之路】【之前没搞明白的】6面向对象(编程思路及步骤)

思路 设计功能——使用功能 步骤 光学会了class的语法还不足以让我们学会怎么去编程.就像学会了和水泥.垒砖.刮腻子 但是却不知道怎么去盖楼一样.有个顺序: 1. 定模型 多少个类2. 定属性 每个类需要哪些属性,self.name 这样的3. 定关系 每个类之间有什么关系,继承.依赖.组合.关联4. 画XML图 https://www.processon.com/5. 写代码 这是不是架构师的主要工作! 原文地址:https://www.cnblogs.com/watalo/p/123299

【python之路】【之前没搞明白】8面向对象(反射,非常重要)

反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩. 一句话解释:通过字符串的形式操作对象相关的属性 四个函数: 方法 作用 hasattr(*args, **kwargs) 返回对象里面是否有这个属性 *args:目标实例.对象.eg:p, Person **kwargs:属性的名字,以字符串形

利用NativeWindow监视WndProc消息(好像是一个字典,没搞明白)

http://blog.csdn.net/lovefootball/article/details/1784882 在写Windows应用程序的时候,经常会碰到需要修改例如MessageBox或者FileDialog的外观此时我们需要监视 WndProc的消息当然也可以直接调用API实现,具体方法请参考http://www.codeproject.com/csharp/GetSaveFileName.asp?df=100&forumid=96342&exp=0&select=195

Python之路第一课Day6--随堂笔记(面向对象编程进阶...未完待续 )

本节内容: 面向对象高级语法部分 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个支持多用户在线的FTP程序 面向对象高级语法部分 一.静态方法 通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例变量或类变量,但静态方法是不可以访问实例变量或类变量的,一个不能访问实例变量和类变量的方法,其实相当于跟类本身已经没什么关系了,它

poj3687 拓扑排序 还没怎么搞明白 回头再想想

[题意]:n个重量为1~n的球,给定一些球之间的重量比较关系(如 2 1  表示第二个球比第一个球轻),求每个球可能的重量,ans[i] 表示第i个球的重量,要求输出的是ans字典序最小的情况. [思路]:对于给出的a b  建反边,每次 在出度为0的所有点里选一个序号最小的赋值(从n开始 由大到小赋). 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<string>

Python之路【第十九篇】:爬虫

Python之路[第十九篇]:爬虫 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁.自动索引.模拟程序或者蠕虫. Requests Python标准库中提供了:urllib.urllib2.httplib等模块以供Http请求,但是,它的 API 太渣了.它是为另一个时代.另一个互联网所创建的.它需要巨量的工作,甚至包括各种方法覆盖,来完成最简单的任务. import

七日Python之路--第五天(之找点乐子)

(一)一些闲言碎语 刚才在搜索的时候,看到别人说的一句话,大体意思如下:自从学习Python之后,就不想在学习其他语言了,只想抓紧时间写些有用的东西.细想一下,果真如此. 唉,Python魅力如此之大.感觉比Java容易的多,也可能是小众语言,因为足够小才显得足够强大.算了,不愿多想,还是多写些有意思的东西吧,哈哈. (二)一些有趣的代码 (1)一句话文件服务器 [email protected]:~$ python -m SimpleHTTPServer Serving HTTP on 0.0

python之路,Day24 常用设计模式学习

python之路,Day24 常用设计模式学习 本节内容 设计模式介绍 设计模式分类 设计模式6大原则 1.设计模式介绍 设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一