浅谈python使用多态跟不用多态的区别

本文通过对比有无多态性的代码示例,展示了多态性如何提高代码灵活性与扩展性。多态允许不同子类对象调用相同父类方法时产生不同执行结果。
Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

多态不同的 子类对象调用 相同的 父类方法,产生 不同的 执行结果,可以增加代码的外部 调用灵活度
  • 多态以 继承 和 重写 父类方法 为前提
  • 多态是调用方法的技巧,不会影响到类的内部设计

下面就用一段简单的代码来看看多态的优点

首先,我们看一下没有多态的代码:

class ArmyDog(object):

    def bite_enemy(self):
        print('追击敌人')

class DrugDog(object):

    def track_drug(self):
        print('追查毒品')


class Person(object):

    def work_with_army(self, dog):
        dog.bite_enemy()

    def work_with_drug(self, dog):
        dog.track_drug()


p = Person()
p.work_with_army(ArmyDog())
p.work_with_drug(DrugDog())
这样可以看出,如果添加一个类,继承Dog,代码的增加就很麻烦。

下面我们来看一下有多态的情形:

class Dog(object):
    def work(self):
        pass


class ArmyDog(Dog):
    def work(self):
        print('追击敌人')


class DrugDog(Dog):
    def work(self):
        print('追查毒品')


class Person(object):
    def work_with_dog(self, dog):  # 只要能接收父类对象,就能接收子类对象
        dog.work()  # 只要父类对象能工作,子类对象就能工作。并且不同子类会产生不同的执行效果。


p = Person()
p.work_with_dog(ArmyDog())
p.work_with_dog(DrugDog())

这样一来,添加一个类就显得很方便了。

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

### Python 多态的实现方式与原理 Python 中的多态(Polymorphism)主要依赖于其动态型系统鸭子型(Duck Typing)机制,这使得多态的实现方式与静态型语言(如 C++ 或 Java)有所不同。Python 多态的核心在于对象的行为(方法)而非型,只要对象具有所需的方法,就可以在多态上下文中使用。 #### 动态型与鸭子Python 是一种动态型语言,变量的型在运行时确定,并且对象的方法属性在运行时解析。这种特性使得 Python 支持所谓的“鸭子型”,即“如果它走起来像鸭子,叫起来也像鸭子,那它就是鸭子”。因此,多态Python 中并不依赖于继承关系,而是依赖于对象是否实现了特定的方法。 例如,一个 `Canvas` 中的 `draw_pic()` 方法可以接受任何具有 `draw()` 方法的对象作为参数,而无需关心该对象的具体型。这种灵活性使得代码更加通用可扩展[^1]。 ```python class Circle: def draw(self): print("Drawing a circle") class Square: def draw(self): print("Drawing a square") class Canvas: def draw_pic(self, shape): shape.draw() canvas = Canvas() canvas.draw_pic(Circle()) # 输出: Drawing a circle canvas.draw_pic(Square()) # 输出: Drawing a square ``` 在上述代码中,`Canvas` 的 `draw_pic()` 方法接受任何具有 `draw()` 方法的对象,体现了多态的灵活性[^2]。 #### 多态的实现原理 Python多态实现与 C++ 等静态型语言不同。在 C++ 中,多态通常通过虚函数表(vtable)实现,每个对象内部保存了指向其的虚函数表的指针。而在 Python 中,多态的实现更依赖于对象的型信息方法解析机制。 在 Python 的底层实现中,所有对象都以 `PyObject` 结构体为基础,其中包含了对象的引用计数(`ob_refcnt`)型信息(`ob_type`)。当一个对象(如 `PyIntObject`)被转换为 `PyObject` 指针时,可以通过 `ob_type` 字段找到该对象的实际型,并调用相应的函数。这种机制使得 Python 能够支持多态行为,即使对象的型在运行时发生变化,也能正确调用相应的方法[^4]。 #### 继承多态 尽管 Python多态不强制依赖于继承,但继承仍然是实现多态的一种常见方式。通过定义一个基,并在派生中重写其方法,可以在运行时根据对象的实际型调用相应的方法。 ```python class Shape: def draw(self): pass class Circle(Shape): def draw(self): print("Drawing a circle") class Square(Shape): def draw(self): print("Drawing a square") def draw_shape(shape): shape.draw() draw_shape(Circle()) # 输出: Drawing a circle draw_shape(Square()) # 输出: Drawing a square ``` 在上述代码中,`draw_shape()` 函数接受 `Shape` 型的参数,并调用其 `draw()` 方法。由于 `Circle` `Square` 都继承自 `Shape` 并重写了 `draw()` 方法,因此在运行时会根据对象的实际型调用相应的方法。 #### 多态的优势 Python 多态的优势在于其灵活性可扩展性。程序中涉及多态的方法(如 `Canvas` 的 `draw_pic()` 方法)所需的参数非常灵活,只要传入的对象具有指定的方法即可,至于该方法呈现怎样的行为特征,则完全取决于对象本身。这种机制大大提高了代码的通用性可维护性[^1]。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值