python 多态应用_类的多态的理解和应用场景

课上的理解

用例子说明:

class People(object): # 先定义一个基类

def talk(self): # 基类的talk方法,我们不希望被调用,写一个会抛出错误的代码

"如果基类的这个方法被调用,就抛出一个错误"

raise NotImplementedError("Subclass must implement abstract method")

class Chinese(People): # 这个是子类

def talk(self): # 重构talk方法

print("你好,世界")

class American(People):

def talk(self):

print("Hello World")

# 如果调用了基类的方法,会根据raise里定义的,抛出一个错误。去掉下面的注释测试一下

#p1 = People() # 实例化一个基类

#p1.talk() # 调用基类的talk方法

# 实例化2个对象

c1 = Chinese()

a1 = American()

# 通过子类调用自己的方法当然没问题。要用多态就是要使用统一的接口来实现这2条命令

c1.talk()

a1.talk()

# 多态是要用父类调用子类

#People.talk(c1) # 这样是最好的,真正的直接实现多态的方法,但是Python不支持

#People.talk(a1)

# 间接支持多态的方法,定义一个函数作为统一的接口

def People_talk(obj):

obj.talk()

# 用新定义的接口,调用不同的子类,每次用的都是这个子类里重构的那个方法

People_talk(c1) # 传入一个c1对象,实际就是执行c1.talk()

People_talk(a1) # 传入一个a1对象,实际就是执行a1.talk()

上面的例子中,用同一个接口People_talk(),传入不同的对象,调用的是不同的方法。

现在的理解

在学习面相对象之前,调用函数都是这样的:函数名()

现在,类中的函数叫做方法,调用的时候是这样的:对象名.方法名()

同样都是函数,但是现在有了两种调用方式。多态可以将方法的调用方式传化成之前函数的调用方式函数名(对象名) ,这样就统一了接口的调用方式。原来的对象是作为函数名,传化后对象作为函数的参数。

应用场景

同样都是函数,因为放在了类中,导致了调用方式的变化。在类外重新定义一个接口,把调用方式再变回去

class Classes(object):

def __init__(self,name,teacher):

self.name = name

self.teacher = teacher

class Teacher(object):

def __init__(self,name,classes):

self.name = name

self.classes = classes

def check_student(self,student_obj):

if self.classes == student_obj.classes:

print("%s is your student"%teacher_obj.name)

else:

print("This is not your student")

class Student(object):

def __init__(self,name,classes):

self.name = name

self.classes = classes

def get_teacher(self):

print(self.classes.teacher)

def Student_get_teacher(obj):

obj.get_teacher()

c1 = Classes("Class1","Jerry")

t1 = Teacher("Jerry","Class1")

s1 = Student("Tom",c1)

s1.get_teacher()

Student_get_teacher(s1) # 上面的多态,效果和上面那句一样,但是调用方式和下面的一样

t1.check_student(s1) # 现在两个方法都是将一个对象作为参数调用执行了

key = input("输入1或者其他") # 根据你的输入,决定func具体是哪个方法

func = Student_get_teacher if key == '1' else t1.check_student

func(s1) # 无论func是哪个方法,现在都是统一传入一个对象执行了

不用多态也是可以的,不过现在至少多了一个解决问题的途径了。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值