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

课上的理解

用例子说明:

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是哪个方法,现在都是统一传入一个对象执行了

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





本文转自骑士救兵51CTO博客,原文链接:http://blog.51cto.com/steed/2046437,如需转载请自行联系原作者

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值