python 多态应用_面向对象的多态特性及抽象类应用

要了解多态就得先了解强类型语言和弱类型语言,如果只是学过python可能不好理解,因为没有对比就无从无感受。学过C的话就好理解了。如果没有数据类型的概念可以查看

强类型定义语言

强制数据类型定义的语言。也就是说,一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了,不能被赋值成其他类型。如果你定义了一个整型变量a,那么程序根本不可能将a当作字符串类型处理。强类型定义语言是类型安全的语言。

弱类型定义语言

数据类型可以被忽略的语言。它与强类型定义语言相反,一个变量可以赋不同数据类型的值。

python就是典型的弱类型语言,对于弱类型的语言来说,变量并没有声明类型,因此同一个变量完全可以在不同的时间引用不同的对象。当同一个变量在调用同一个方法时,完全可能呈现出多种行为(具体呈现出哪种行为由该变量所引用的对象来决定),这就是所谓的多态(Polymorphism)。

多态在函数中也能体现,给一个函数的参数传递数值就打印数值,传递字符串就打印字符串。

# ‐*‐ coding: utf‐8 ‐*‐

def print_info(arg):

print(arg,type(arg))

print_info("字符串")

print_info(123)

D:installpython3python.exe D:/pyscript/test/test.py

字符串

123

Process finished with exit code 0

通过统一函数接口实现多态

# -*- coding: utf-8 -*-

class Dog(object):

def say(self):

print("汪汪汪.....")

class Cat(object):

def say(self):

print("喵喵喵.....")

def my_say(obj_type):

"""统一调用接口"""

obj_type.say() # 什么对象调用say()方法

if __name__ == "__main__":

dog_obj = Dog()

cat_obj = Cat()

my_say(dog_obj)

my_say(cat_obj)

汪汪汪.....

喵喵喵.....

通过抽象类实现多态(最常用)

假如你开发一个数据库操作功能,支持多种数据库,你也不确定会连接哪种数据库,可能是Mysql、clickhouse、redis等,假如为每个数据库都写一个类,每个类都通过connect()方法来连接,为了确保每个类都必须实现connect()方法,就可以写一个抽象类。

# -*- coding: utf-8 -*-

class Database:

def __init__(self, name):

self.name = name

def connect(self):

raise NotImplementedError("子类 must implement abstract method")

class Clickhouse(Database):

def connect(self):

return '连接 Clickhouse'

class Redis(Database):

def connect(self):

return '连接 Redis!'

if __name__ == "__main__":

dbs = [Clickhouse('database1'),Redis('database2')]

for db in dbs:

print(db.name + ': ' + db.connect())

database1: 连接 Clickhouse

database2: 连接 Redis!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值