Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 解释多态性_Python_Oop_Polymorphism_Definition - Fatal编程技术网

Python 解释多态性

Python 解释多态性,python,oop,polymorphism,definition,Python,Oop,Polymorphism,Definition,什么是多态性?我不确定我是否理解正确 在Python范围内,我从中得到的是我可以定义如下参数: def blah (x, y) 无需指定类型,与另一种语言(如Java)相反,它看起来更像是: public void blah (int x, string y) 我说得对吗?是的,这是“类型多态性”的一个例子。然而,当谈到面向对象编程时,“多态性”通常与“子类型多态性”有关。您给出的示例通常称为“类型化” java、C++、C++等,使用静态类型。在这种情况下,必须指定编译时的类型 Pyth

什么是多态性?我不确定我是否理解正确

在Python范围内,我从中得到的是我可以定义如下参数:

def blah (x, y)
无需指定类型,与另一种语言(如Java)相反,它看起来更像是:

public void blah (int x, string y)

我说得对吗?

是的,这是“类型多态性”的一个例子。然而,当谈到面向对象编程时,“多态性”通常与“子类型多态性”有关。您给出的示例通常称为“类型化”

java、C++、C++等,使用静态类型。在这种情况下,必须指定编译时的类型

Python和Ruby使用动态,因为类型是在解释过程中推断出来的

子类型多态性或“多态性”是作为派生类型的基类引用正确调用派生类型的方法的能力

例如(在近似伪代码中):


这就是多态性。

多态性的字面意思是“许多形状”,这很好地解释了它的用途。多态性背后的思想是,可以对不同的类型使用相同的调用,并使它们行为适当

将其与类型系统区分开来很重要-强类型语言要求通过继承链将对象关联为多态的,但对于弱类型语言,这是不必要的

在Java(等人)中,这就是接口之所以有用的原因——它们定义了可以在对象上调用的函数集,而无需指定确切的对象——实现该接口的对象相对于该接口是多态的


在Python中,由于事物是动态类型化的,接口就不那么正式了,但思想是一样的——在两个知道如何正确实现foo()的对象上调用foo()会成功,但我们不关心它们到底是什么类型。

以多种形式定义函数的能力称为多态性。在C++中,java、C++有两种多态类型:编译时多态(<强>重载< /强>)和运行时多态(<强>重写< /强>)。 重写:当类方法与父类中的方法具有相同的名称和签名时,会发生重写

重载:重载在编译时确定。当多个方法具有相同的名称时,会发生此错误:

  • 不同的方法签名和不同数量或类型的 参数
  • 方法签名相同,但参数数量不同
  • 相同的方法签名和相同数量的参数,但类型不同

  • 您所说的是自动键入,或者可能是类型检测。这是一种动态语言倾向于做的事情——它允许用户在构建时不知道或不关心类型——类型是在运行时计算出来的,而不限于特定的类型

    多态性是指有两个类继承自一个主类,但每个类实现的方法不同

    例如,如果将Vehicle作为根类,将Car和Bicycle作为实例,则如果车辆是Car的实例,则Vehicle.CalculateInstance()将基于可用的汽油进行操作,如果车辆是自行车类型,则将基于骑自行车者的耐力进行操作

    通常是这样使用的:

    getTotalDistance(Vehicle[] vehicle) {
        int dist=0
        for each vehicle
            dist+=vehicle.calculateDistance();
    

    请注意,您传递的是基类型,但实例永远不会是Vehicle本身,而是Vehicle的子类——但您不会将其强制转换为子类型。多态性意味着车辆变形为所需的任何子对象。

    不,这不是多态性。多态性是一个概念,即一个可执行单元可以有许多不同的实现,并且差异发生在幕后,而调用方不知道

    例如,鸟和飞机是飞行对象。所以FlyingObject有一个方法调用
    fly()
    ,Bird和Plane都实现了
    fly()
    方法。Bird和Plan飞行方式不同,因此实现方式也不同。在客户端看来,鸟或飞机如何飞行并不重要,他们只需调用FlyingObject的
    fly()
    方法,不管该对象是平面还是鸟

    您所描述的是动态和静态类型检查,类型兼容性分别在运行时和编译时完成

    希望这一切都能实现。
    NawaMan

    简短回答:为特定目的将不同类型的编程类型实例视为相同的能力

    长答覆: 来自古希腊的poly(多)+morph(形式)+ism

    多态性是一种通用技术,能够以某种方式统一处理不同的类型。编程领域的例子包括:

    • 参数多态性
      (视为 (Java中的泛型)
    • 子类型
      多态性
      ,在Java中实现 使用动态消息分派 在对象实例之间
    • 特设 多态性,它与 能够定义 相同的名称,仅因类型而异 它们处理(Java中的重载)

    “多态性”一词也用于描述其他不相关领域的概念,如a。

    注意不同的人使用不同的术语;特别是,在和(其他部分)之间通常存在裂痕

    一般来说,多态性意味着一个方法或函数能够处理不同类型的输入。例如,
    Integer
    类中的
    add
    方法(或
    +
    运算符)可能执行整数加法,而
    Float
    类中的
    add
    方法执行浮点加法,而
    Bignum
    类中的
    add
    方法对任意大小的数字执行正确的操作。多态性是调用
    addgetTotalDistance(Vehicle[] vehicle) {
        int dist=0
        for each vehicle
            dist+=vehicle.calculateDistance();
    
    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
    
    thing.dosomething()