首页 > 其他分享 >44.多态

44.多态

时间:2023-11-17 17:23:10浏览次数:31  
标签:__ 44 Father 多态 cure print class def

多态

多态是面向对象编程中三大概念之三,它允许不同的对象对同一个消息作出不同的响应。

简单来说,多态是指同一个方法或操作符在不同的对象实例上可以有不同的行为。这意味着可以通过一个共同的接口或基类引用不同的子类对象,并根据实际的对象类型来调用相应的方法。

多态性在实际应用中提供了很多好处,包括:

  1. 简化代码:通过以相同的方式处理不同的对象,并使用统一的接口进行编程,可以降低代码的复杂性和重复性。

  2. 可维护性:多态可以提高代码的可维护性。当需要新增一种子类时,不需要修改已有的代码,只需要创建一个新的子类并继承父类,就能够在原有的代码基础上实现新的功能。

  3. 扩展性:由于多态允许在不修改已有的代码的情况下新增功能,因此可以更容易地对系统进行扩展和适应需求的变化。

多态性的实现通常通过继承和方法重写来实现。在继承关系中,子类可以重写父类的方法,在父类引用子类对象时,调用的实际上是子类重写后的方法。

# 中医
class Father:
def cure(self):
print("使用中医方法进行治疗")


# 西医
class Son(Father):
def cure(self):
print('使用西医方法进行治疗')


# 患者
class Patient:
def needDocter(self, docker):
docker.cure()


if __name__ == '__main__':
oldDoctor = Father()
littleDoctor = Son()
patient = Patient()
patient.needDocter(oldDoctor)
patient.needDocter(littleDoctor)

鸭子类型

鸭子类型(Duck Typing)是一种动态类型的概念,它源自于“走起来像鸭子、叫声像鸭子、看起来像鸭子,那么它就是鸭子”的观念。

在鸭子类型中,一个对象的适用性不是由它的类或接口决定,而是由它的方法和属性是否与所需的方法和属性匹配来决定。换句话说,只要一个对象具有特定方法和属性,我们就可以将其视为具有相同类型。

举个例子,如果我们需要一个能“叫”的对象,并且某个对象有一个名为quack()的方法,那么我们可以将该对象视为一个“鸭子”,不管它实际上是什么类的对象。换句话说,我们关注的是对象的行为而不是其类型。

鸭子类型在动态语言中特别常见,比如 Python。在 Python 中,不需要显式地继承或实现接口,只要一个对象具有必需的方法和属性,它就可以被认为是某种类型。这使得 Python 具有灵活性和简洁性,可以更自由地处理不同类型的对象。

# 中医
class Father:
def cure(self):
print("使用中医方法进行治疗")


# 西医
class Son(Father):
def cure(self):
print('使用西医方法进行治疗')


# 兽医
class AnimalDoctor:
def cure(self):
print("使用兽医方法进行治疗")


# 患者
class Patient:
def needDoctor(self, docker):
docker.cure()

if __name__ == '__main__':
oldDoctor = Father()
littleDoctor = Son()
animalDoctor = AnimalDoctor()
patient = Patient()
patient.needDoctor(oldDoctor)
patient.needDoctor(littleDoctor)
patient.needDoctor(animalDoctor)

鸭子类型通常是动态语言的特性,相比于静态类型语言,它在编译时没有类型检查。这意味着无法在编译阶段对类型不匹配或缺失方法和属性进行检测,可能会导致运行时错误。

类型检查

Python 中提供了 isinstance() 和 issubclass() 两个函数,用来对数据进行检查判断。

isinstance()

Python 中使用 isinstance() 来检查一个实例的类型

格式: isinstance(obj, type)

判断 obj 对象是否是 Type 指定类型或其父类类型的实例。

print(isinstance(littleDoctor, Father))
print(isinstance(littleDoctor, Son))
print(isinstance(littleDoctor, AnimalDoctor))
前面示例的代码可以进行优化:
# 患者
class Patient:
def needDoctor(self, docker):
if isinstance(docker, Father):
docker.cure()
else:
print('此大夫医疗方法不适用病人。。。')

issubclass()

Python 中还可以使用 issubclass() 来检查类的继承关系。

格式: issubclass(Type1, Type2)

判断 Type1 是否是 Type2 的子类

print(issubclass(Father, Father))
print(issubclass(Son, Father))
print(issubclass(AnimalDoctor, Father))
前面的示例也可优化为:

class Patient:
def needDoctor(self, doctor):
if issubclass(doctor.__class__, Father):
doctor.cure()
else:
print("此大夫医疗方法不适用病人。。。")

__class__ 是一个魔法属性,用来获取当前实例对象的类。

标签:__,44,Father,多态,cure,print,class,def
From: https://www.cnblogs.com/csfsz/p/17839246.html

相关文章

  • 344. 反转字符串
    2023-11-16344.反转字符串-力扣(LeetCode)思路:        //栈    //头插链表    //o1 双指针双指针:classSolution{publicvoidreverseString(char[]s){//栈//头插链表//o1双指针inti=0;......
  • 244.小工具
    1.python修改某个目录文件名称frompathlibimportPathp1=Path(r"C:\Users\Administrator\Desktop\tmp\test_md")#给文件编号count=1#匹配所有.md结尾的文件forfileinp1.glob("*.md"):new_file=p1/f"{count}.{file.name}"file.renam......
  • 同程面试:说一下多态的实现原理?
    前段时间朋友去同程旅行面试,被问到了一个看似简单,实则“有点东西”的问题:“了解多态的实现原理吗?”,所以今天我们就来聊一聊这个问题。和朋友的聊天截图:为了保护朋友隐私,所以这里只把咱们今天讨论的问题展示给大家,如果有需要整个面试题的,可以单独找我获取:gg_stone【备注:同程】......
  • 9--844. 比较含退格的字符串
    给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true 。# 代表退格字符。注意:如果对空文本输入退格字符,文本继续为空。 示例1:输入:s="ab#c",t="ad#c"输出:true解释:s和t都会变成"ac"。示例2:输入:s="ab##",t="c#d#"输......
  • js是一门基于对象的语言,js不是面向对象的语言,但是可以模拟面向对象的思想,具体说面向
    下列关于JavaScript的说法中正确的是()A所有变量在使用之前必须做声明BJavaScript是面向对象的程序设计语言CJavaScript是解释性语言DJavaScript前身是Oak语言正确答案:C选C。解释性语言是相对于编译型语言存在的,源代码不是直接翻译成机器语言,而是先翻译成中间代码,再由......
  • 044_第三代软件开发-保存PDF
    第三代软件开发-保存PDF文章目录第三代软件开发-保存PDF项目介绍保存PDF头文件源文件使用关键字:Qt、Qml、pdf、painter、打印项目介绍欢迎来到我们的QML&C++项目!这个项目结合了QML(QtMeta-ObjectLanguage)和C++的强大功能,旨在开发出色的用户界面和高性能的后端逻辑......
  • [题解] P4435 [COCI2017-2018#2] ​​Garaža
    P4435[COCI2017-2018#2]Garaža给你一个长度为\(n\)的序列\(a\),单点改,查询区间\(\gcd\)不为1的子区间个数。\(n,Q\le10^5,a_i\le10^9\)。先看单次全局查询怎么做。考虑一个分治,每次我们要计算跨过分治中心\(mid\)的答案。因为这个是单调的,所以可以双指针做......
  • C++多态
    1、静态多态(1)函数重载 函数重载以参数的类型或数量不同来区分不同用途的同名函数。不以返回值不同来区分函数。编译器在调用函数时会在意函数的参数,不会在意函数的返回值。intmyAdd(inta,intb);floatmyAdd(doublea,doubleb);(2)运算符重载 使用关键字operator来......
  • 多态真的有用吗?使用在哪些场景?
    多态是面向对象编程(OOP)中的一个重要概念,它能够增加代码的灵活性和可维护性。多态的主要思想是同一个方法名在不同的类中有不同的实现,或者说同一个接口可以有多个不同的实现方式。让我们通过一个生动的例子来说明多态的用途。假设有一个图形类,其中包括圆形和矩形两个子类。每个图形......
  • GitHub-fatal-unable-to-access-https-github-com-Failed-to-connect-to-github-com-p
    title:>-[GitHub]fatal:unabletoaccess'https://github.com/':Failedtoconnecttogithub.comport443:Operationtimedouttags:[github,git]categories:githubdate:2021-11-2311:11:002021年11月,由于众所周知的缘故,连接到github越来越微妙,分享一些MAC......