面向对象三大特性——多态(含鸭子类型)

一、多态概念

  在面向对象编程中,接口的多种不同的实现方式即为多态。多态的作用,就是为了类在继承和派生的时候,保证使用“家谱”中任一类的实例的某一属性时的正确调用。

二、多态目的

  多态的目的就是实现接口重用

  多态指的是一类事物有多种形态。比如动物有多种形态:人、狗、猪。

import abc    #利用abc模块实现抽象类
class Animal(metaclass=abc.ABCMeta):  # 类似接口,只定义规范,不实现具体的代码
    @abc.abstractclassmethod
    def talk(self):
        pass

class People(Animal):  # 动物形态之一:人
    def talk(self):
        print('people is talking')

class Pig(Animal):     # 动物形态之二:猪
    def talk(self):
        print('Pig is talking')

class Dog(Animal):     # 动物形态之三:狗
    def talk(self):
        print('Dog is talking')

三、多态性

1、多态性概念

  多态性指在不考虑实例类型的情况下使用实例,多态性分为静态多态性和动态多态性。

  静态多态性:就是在系统编译期间就可以确定程序执行到这里将要执行哪个函数

  动态多态性:则是利用虚函数实现了运行时的多态,也就是说在系统编译的时候并不知道程序将要调用哪一个函数,只有在运行到这里的时候才能确定接下来会跳转到哪一个函数的栈帧。如下所示:

peo1 = People()
pig1 = Pig()
dog1 = Dog()
# 调用方法不用考虑三者具体是什么类型直接使用,这种就是动态多态性

# peo1.talk()
# pig1.talk()
# dog1.talk()


#更进一步,我们可以定义一个统一的接口来使用
def func(animal):
    animal.talk()

func(peo1)
func(pig1)
func(dog1)

  由上例可以看出,python本身就是支持多态性的。

2、多态性的好处

(1)增加程序的灵活性

      以不变应万变,无论对象千变万化,使用者都是同一种形式去调用

(2)增加程序的扩展性

      通过继承animal类创建一个新类,使用者可以不改变自己的代码,依然用func(animal)调用

>>> class Cat(Animal): #属于动物的另外一种形态:猫
...     def talk(self):
...         print('say miao')
... 
>>> def func(animal): #对于使用者来说,自己的代码根本无需改动
...     animal.talk()
... 
>>> cat1=Cat() #实例出一只猫
>>> func(cat1) #甚至连调用方式也无需改变,就能调用猫的talk功能
say miao

'''
这样我们新增了一个形态Cat,由Cat类产生的实例cat1,使用者可以在完全不需要修改自己代码的情况下。
使用和人、狗、猪一样的方式调用cat1的talk方法,即func(cat1)
'''

四、鸭子类型

  什么是鸭子类型(Duck Typing)?鸭子类型可解释为,如果一只动物,走起来像鸭子或者叫起来像鸭子,就可以把它当作鸭子。

  python崇尚一种鸭子类型,类与类之间不用共同继承一个父类,只需要将它们做得像一种事物即可。

例如,如果想编写现有对象的自定义版本。

  1、可以继承该对象

  2、可以创建一个外观和行为像,但与它无任何关系的全新对象(通常用于保存程序组件的松耦合度)

例1:利用标准库中定义的各种‘与文件类似’的对象,尽管这些对象的工作方式像文件,但他们没有继承内置文件对象的方法

class File:
    def read(self):
        pass

    def write(self):
        pass

class Disk:
    def read(self):
        print('disk read')

    def write(self):
        print('disk write')

class Text:
    def read(self):
        print('text read')

    def write(self):
        print('text write')


disk = Disk()
text = Text()

disk.read()
disk.write()

text.read()
text.write()
"""
disk read
disk write
text read
text write
"""
像文件的类

例2:序列类型有多种形态:字符串,列表,元组,但他们直接没有直接的继承关系

# 序列类型:列表list、元组tuple、字符串str
l = list([1, 2, 3])
t = tuple(('a', 'b'))
s = str('hello')

print(l.__len__())  # 3
print(t.__len__())  # 2
print(s.__len__())  # 5
像序列的类型

 

转载于:https://www.cnblogs.com/xiugeng/p/8930733.html

Python面向对象编程:封装、继承与多态实战解析 面向对象编程(OOP)是现代软件开发的核心范式,通过封装、继承和多态三大特性构建可维护的系统架构。封装将数据与操作绑定,实现信息隐藏和访问控制,Python中使用@property和命名约定实现工程级封装。继承建立类层次关系实现代码复用,但需注意多重继承的MRO问题。多态通过鸭子类型和抽象基类支持接口统一,使系统扩展更灵活。这些特性在电商系统重构、物联网设备管理等场景中显著提升开发效率,配合设计模式使用可构建高内聚低耦合的系统。本文结合Python特性与实战案例,深入解析OOP三大支柱的应用技巧与工程实践。 阅读详情

相关推荐

为什么要用多态

多态是OOP(面向对象编程)的一项重要技术。 任何技术都不是凭空想出的,他都是为了解决一定实际问题的。多态其实是程序设计的一种方法学,他不仅能让程序设计更加易实现,也更容易维护和扩展。程序的初学者大多很难在一开始就理解这些技术难点。 下面看一个应用场景,一个软件要实现下面功能:用户在界面上添加各种几何图形(圆,三角形和正方形),用户可以以任意顺序、任意数量(当然内存不要溢出即可)添加上述几何图...

tushenfengle的博客 2432

Python高阶专题:鸭子类型多态

鸭子类型

Mr_zhangbz的博客 716

C++多态详解

C++多态详解

qq_52905520的博客 2903

什么是多态?为什么用多态?有什么好处?多态在什么地方用?

什么是多态? 概念:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。简单的说:就是用基类的引用指向子类的对象。 为什么要用多态呢? 原因:我们知道,封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。而多态除了代码的复用性外,还可以解决项目中紧偶合的问题,提高程序的可扩展性.。耦合度讲的是模块...

weixin_30527551的博客 4081

python面向对象编程,创建一个动物类(Animal)中南民族大学python作业

需求: (1) 创建一个动物类(Animal),动物有自己的名字,动物能吃、能喝、能跑、能睡 (2)创建一个狗类(Dog),狗类继承自动物类,狗类有名字,品种,除了能吃、能喝、能跑、能睡,还能汪汪叫 (3)创建一个猫类(Cat),猫类继承自动物类,猫类有名字,年龄,除了能吃、能喝、能跑、能睡,还能喵喵叫,还能抓老鼠 (4)创建一个哮天犬类(xiaotian),哮天犬类继承自狗类,除了能吃、能喝、能跑、能睡,能汪汪叫,叫声很豪迈,还能飞。 创建适当的实例对象验证面向对象的继承与多态的特点。 运行结果如下:

m0_52692190的博客 1万+

Python 面向对象三大特性:继承、封装、多态

Python 面向对象三大特性:继承、封装、多态

m0_68623519的博客 407

05-封装、继承与多态

面向对象编程(OOP)的三大特性——封装、继承、多态——在 JavaScript 中有独特的实现方式。本文将系统梳理 JS 中的 OOP 实践,从闭包封装到原型链继承,再到鸭子类型多态

以梦想为帆,行动作桨,驶向辉煌彼岸。 232

python进阶教程-第二章:面向对象特性

本章深入讲解Python面向对象三大特性:继承、多态和封装。继承允许子类复用父类代码并扩展功能,包括单继承和多继承(需注意方法解析顺序MRO)。多态使不同对象可通过统一接口调用。封装隐藏实现细节保护数据安全。此外还介绍了类方法和静态方法的区别与使用场景,帮助编写更优雅高效的Python代码。通过实际代码示例演示了继承的实现、方法重写及super()函数用法,为掌握面向对象编程奠定基础。

qq3342560494的博客 419

Python从入门到精通】第 009 篇:面向对象编程(二):继承、封装与多态

摘要 本文深入讲解Python面向对象编程的三大核心特性:继承、封装与多态。继承通过子类复用父类代码并扩展功能,包括单继承、多继承及方法解析顺序(MRO);封装通过命名约定(如_protected和__private)实现数据保护;多态则通过方法重写和鸭子类型实现接口统一。文章结合代码示例详细演示了super()函数调用、@property装饰器使用、抽象基类实现等关键技术点,帮助开发者掌握面向对象编程的核心思想与实践方法。

xyghehehehe的专栏 342

Python系列课程】Python面向对象(下):封装、继承与多态

📊 阅读时长:24分钟 | 关键词:Python面向对象、封装、继承、多态、super()、方法重写、MRO上一篇文章我们学了类和对象的基础——如何定义类、创建对象、使用属性和方法。但那只是面向对象的"语法",不是"思想"。面向对象编程真正的威力在于三大特性:封装、继承、多态。看一个没有封装的例子: 任何人都可以直接修改 ,没有任何保护。封装就是解决这个问题的——隐藏内部实现细节,只暴露安全的接口。Python 没有 Java/C++ 那样的 / 关键字。它通过命名约定来实现访问控制:在属性名或方法名前加

程序大视界 476

Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解

Python 编程中,面向对象编程(Object-Oriented Programming,简称 OOP)是一种强大的编程范式。它将数据和操作数据的方法封装在一起,形成“对象”。今天我们将深入探讨 OOP 的三大核心特性:继承、多态和魔法函数。掌握这些概念,你将能编写出更模块化、可复用、易维护的代码。继承允许我们定义一个类(子类)来继承另一个类(父类)的属性和方法。子类可以复用父类的代码,并可以添加或修改自己的功能。 2.3 继承的类型 单继承:一个子类只继承一个父类(如上例) 多继承:一个子类可以继

2601_96493715的博客 232

python面向对象、类、三大特性(封装、继承、多态)

python面向对象、类介绍,对象的三大特性

qingyulee的博客 435

11.Python 面向对象三大特性详解:封装、继承、多态与多继承、魔术方法及抽象类

抽象类是一种不能直接实例化的类,它定义了一组必须由子类实现的抽象方法。Python 通过abc模块提供抽象基类的支持。抽象类常与多态结合,强制子类实现特定接口。passpass抽象类确保了所有子类都遵循统一的接口约定,提高了代码的健壮性和可读性。如果子类未实现所有抽象方法,Python 会在实例化时抛出TypeError。

平时的经验总结,学习历程 179

快速学习Python基础知识详细图文教程11--类和对象2

11、快速学习Python基础知识详细图文教程11--类和对象2

测试开发 264

day-026-面向对象-中

学习内容掌握情况一句话要点封装 @property✅ 重点方法假装属性,可加校验逻辑单下划线 / 双下划线✅ 理解_x约定私有,__x名称改写继承 class Child(Parent)✅ 重点复用父类的代码super()✅ 重点调用父类方法方法重写✅ 理解子类覆盖父类的方法多态 / 鸭子类型✅ 理解不在乎类型,只在乎有没有那个方法。

chouchuang的博客 201

Python基础 OOP 核心三部曲:一文秒懂封装、继承与多态

本文系统讲解了Python面向对象编程的核心概念和实践技巧。文章首先通过生动的工厂比喻解释类与对象的关系,详细介绍了类的定义、构造方法(init)和self关键字的使用。重点剖析了OOP三大特性:封装(通过私有属性和@property实现)、继承(包括方法重写和多继承MRO)多态(通过鸭子类型实现)。最后深入讲解了魔术方法的妙用,如__str__、__eq__等,并提供了完整的Student类实现示例。全文通过丰富的代码案例,帮助读者从面向过程平滑过渡到面向对象编程,掌握写出更优雅Python代码的关键技

2301_80420058的博客 384

模块3:Python高级--Day12:面向对象进阶

在java里,多态是同一个对象具有不同表现形式或形态的能力,即对象多种表现形式的体现,就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。通俗的说,把该隐藏的隐藏起来,该暴露的暴露岀来。

m0_56693018的博客 219

Python基础_面向对象2

本文介绍了面向对象编程中的继承和封装两大特性。在继承部分,详细讲解了子类如何继承父类的属性和方法,以及方法重写、调用父类方法的两种方式(super()和父类名调用)。同时探讨了多重继承的应用场景,并通过type、isinstance等内置函数进行类型判断。封装部分重点阐述了私有属性的概念,使用双下划线前缀实现属性隐藏,强调通过公共方法访问私有数据的设计思想。全文通过丰富的代码示例展示了面向对象编程提高代码复用性和安全性的核心机制。

慕欣 414
上一篇: 面向对象三大特性——继承高阶(接口和抽象类)
下一篇: 面向对象三大特性——封装(含property)
anmi3721
博客等级 码龄10年 23粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值