【python学习笔记】面向对象之多态

多态的概念
① 指的是一类事物有多种形态
② 继承只是实现代码重用的问题,多态依附于继承,继承的体现方式

#水又多种形态:水,冰,气
class H2O:
	def __init__(self,name,temperature):
		self.name = name
		self.temperature = temperature
	def turn_ice(self):
		if self.temperature < 0:
			print('【%s】温度太低结冰了' % self.name)
		elif self.temperature > 0 and self.temperature < 100:
			print('【%s】液化成水' % self.name)
		elif self.temperature > 100:
			print('【%s】温度太高变成水蒸气了' % self.name)

class Water(H2O):
	pass
class Ice(H2O):
	pass
class Steam(H2O):
	pass

w1 = Water('水',25)
i1 = Ice('冰',-20)
s1 = Steam('气',3000)

#由不同的类实例化得到的对象,调用同一个方法,执行的逻辑不同
#w1.turn_ice()
#i1.turn_ice()
#s1.turn_ice()

#python中的标准类型就是多态概念的示范,例如:类似于str1.__len__()相当于len(str1)
def func(obj):
	obj.turn_ice()

#直接调用,封装成接口,不同对象都可以调用,类似于str1.__len__()相当于len(str1)
#func(w1)
#func(i1)
#func(s1)

#动物有多种形态:人,狗,猪
import abc

class Animal(metaclass=abc.ABCMeta): #同一类事物:动物
    @abc.abstractmethod
	def talk(self):
		pass

class People(Animal): #动物形态之一:人
	def talk(self):
		print('say hello')

class Dog(Animal): #动物形态之一:狗
	def talk(self):
		print('say wangwang')

class Pig(Animal): #动物形态之一:猪
	def talk(self):
		print('say aoao')

#文件有多种形态:文本文件,可执行文件

import abc

class File(metaclass=abc.ABCMeta):
    @abc.abstractmethod
	def click(self): #同一类事物:文件
		pass

class Text(File): #文件的形态之一:文本文件
	def click(self):
		print('open file')

class ExeFile(File): #文件的形态之二:可执行文件
	def click(self):
		print('execute file')

③ python中的标准类型就是多态概念的示范

#str,list,tuple都是序列类型
s=str('hello')
l=list([1,2,3])
t=tuple((4,5,6))
#我们可以在不考虑三者类型的前提下使用s,l,t
s.__len__()
l.__len__()
t.__len__()

print(len(s)) #5
print(len(l)) #3
print(len(t)) #3

多态性的好处
① 增加了程序的灵活性:不管对象怎么变化,使用者都是同一种形式去调用,如func(obj)
② 增加了程序额可扩展性:通过继承基类创建了一个新的类,使用者无需更改自己的代码,还是可以用func(animal)去调用

import abc
class Animal(metaclass=abc.ABCMeta): #同一类事物:动物
    @abc.abstractmethod
    def talk(self):
        pass

class Cat(Animal): #属于动物的另外一种形态:猫
	def talk(self):
		print('say miao')

def func(animal):
	animal.talk()

cat1 = Cat() ##实例出一只猫
func(cat1) #甚至连调用方式也无需改变,就能调用猫的talk功能
#say miao
'''
这样我们新增了一个形态Cat,由Cat类产生的实例cat1,使用者可以在完全不需要修改自己代码的情况下。使用和人、狗、猪一样的方式调用cat1的talk方法,即func(cat1)
''' 

鸭子类型
Python的鸭子类型,即‘如果看起来像、叫声像而且走起路来像鸭子,那么它就是鸭子’
python程序员通常根据这种行为来编写程序。例如:如果想编写现有对象的自定义版本,可以继承该对象也可以创建一个外观和行为像,但与它无任何关系的全新对象

例子:利用标准库中定义的各种与文件类似的对象,尽管这些对象的工作方式像文件,但它们没有继承内置文件对象的方法

class TxtFile:
    def read(self):
        pass

    def write(self):
        pass

class DiskFile:
    def read(self):
        pass
    def write(self):
        pass

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值