Top*_*hef 12 python oop polymorphism definition
什么是多态?我不确定我是否正确理解它.
在Python范围内,我得到的是我可以定义如下参数:
def blah (x, y)
Run Code Online (Sandbox Code Playgroud)
无需指定类型,而不是像Java这样的另一种语言,它看起来更像是:
public void blah (int x, string y)
Run Code Online (Sandbox Code Playgroud)
我做对了吗?
Gil*_*il' 23
请注意,不同的人使用不同的术语; 特别是在面向对象的社区和(其余的)编程语言理论社区之间经常存在分歧.
一般而言,多态意味着方法或函数能够处理不同类型的输入.例如,类中的add方法(或+运算符)Integer可能执行整数加法,而类中的add方法Float执行浮点加法,并且类中的add方法Bignum对任意大小的数字执行正确的操作.多态性是在add不知道它是什么类型的数字的情况下在对象上调用方法的能力.
一种特殊的多态性,通常称为功能社区中的参数多态性和OOP社区中的泛型编程,是能够在不关心其精确类型的情况下对对象执行某些操作的能力.例如,要反转列表,您不需要关心列表元素的类型,只需要知道它是一个列表.因此,您可以编写通用(在这个意义上)列表反转代码:它将在整数,字符串,小部件,任意对象,等等的列表上相同地工作.但是你不能编写以通用方式添加列表元素的代码,因为元素被解释为数字的方式取决于它们的类型.
另一种多态性,通常称为ad-hoc多态性或(至少对于某些形式的)功能社区中的通用编程,并且通常在OOP社区中对多态性进行子类型化(尽管这有点限制了这个概念),它具有单个方法或函数,其行为取决于其参数的精确类型(或者,对于方法,其方法被调用的对象的类型).add上面的例子是ad-hoc多态.在动态类型语言中,这种能力不言而喻; 静态类型语言中往往(但不必须到)有限制,如要求的说法是一些特殊类的子类(Addable).
多态性不是在定义函数时必须指定类型.这与静态与动态类型更相关,尽管它不是问题的固有部分.动态类型语言不需要类型声明,而静态类型语言通常需要一些类型声明(在Java中相当多,在ML中几乎没有).
Tru*_* Ha 14
希望从这个例子中,你会明白是什么Polymorphism.在此图片中,所有对象都有一个方法,Speak()但每个对象都有不同的实现.多态性允许您执行此操作,您可以为类及其子类声明操作,但是对于每个子类,您可以在以后准确写出您想要的内容.

你得到的答案是好的,并解释多态性是什么.我认为它也有助于理解它有用的一些原因.
在某些缺乏多态性的语言中,您会发现自己处于想要在不同类型的对象上执行概念上相同的操作的情况,在这种情况下,必须针对每种类型实现不同的操作.例如,以类似python的语法:
def dosomething(thing):
if type(thing)==suchandsuch:
#do some stuff
elif type(thing)==somesuch:
#do some other stuff
elif type(thing)==nonesuch:
#yet more stuff
Run Code Online (Sandbox Code Playgroud)
这有一些问题.最大的原因是它会导致非常紧密的耦合和大量的重复.您可能在代码中的很多地方都有相同的测试集.如果添加必须支持此操作的新类型会发生什么?你必须找到你有这种条件的每个地方并添加一个新的分支.当然,您必须能够访问所有涉及的源代码才能进行这些更改.除此之外,这种条件逻辑很冗长,在实际案例中难以理解.
能够写下来更好:
thing.dosomething()
Run Code Online (Sandbox Code Playgroud)
除了更短的时候,这会导致更松散的耦合.此示例/解释适用于传统的OO语言,如Python.功能语言的细节略有不同.但是多态性的许多一般用途仍然是相同的.