多态

1.了解多态

多态指的是一类事物有多种形态,(一个抽象类有多个子类,因而多态的概念依赖于继承)。

  • 定义:多态是一种使用对象的方式,子类重写父类方法,调用不同子类对象的相同父类方法,可以产生不同的执行结果
  • 好处:调用灵活,有了多态,更容易编写出通用的代码,做出通用的编程,以适应需求的不断变化!
  • 实现步骤:
    • 定义父类,并提供公共方法
    • 定义子类,并重写父类方法
    • 传递子类对象给调用者,可以看到不同子类执行效果不同

2.体验多态

class Animal:  # 同一类事物:动物
    def talk(self):  # 父类提供统一的方法,哪怕是空方法
        pass

class Cat(Animal):  # 动物的形态之一:猫
    def talk(self):  # 子类重写父类同名方法
        print('喵喵喵')

class Dog(Animal):  # 动物的形态之二:狗
    def talk(self):
        print('汪汪汪')

class Pig(Animal):  # 动物的形态之三:猪
    def talk(self):
        print('哼哼哼')

# 实例化得到三个对象
cat = Cat()
dog = Dog()
pig = Pig()

# 2、为何要有多态
# 多态性指的是可以在不考虑对象具体类型的情况下而直接使用对象
cat.talk()
dog.talk()
pig.talk()


# 定义一个统一的接口来使用
def Talk(animal):
    animal.talk()


Talk(cat)

# 多态性的本质在于不同的类中定义有相同的方法名,这样我们就可以不考虑类而统一用一种方式去使用对象,可以通过在父类引入抽象类的概念来硬性限制子类必须有某些方法名
import abc


# 指定metaclass属性将类设置为抽象类,抽象类本身只是用来约束子类的,不能被实例化
class Animal(metaclass=abc.ABCMeta):  # 统一所有子类的标准
    @abc.abstractmethod  # 该装饰器限制子类必须定义有一个名为talk的方法
    def talk(self):  # 抽象方法中无需实现具体的功能
        pass


class Cat(Animal):  # 但凡继承Animal的子类都必须遵循Animal规定的标准
    def talk(self):
        pass


cat = Cat()  # 若子类中没有一个名为talk的方法则会抛出异常TypeError,无法实例化


# python推崇的是鸭子类型
#  二者看起来都像文件,因而就可以当文件一样去用,然而它们并没有直接的关系
class Txt:  # Txt类有两个与文件类型同名的方法,即read和write
    def read(self):
        pass

    def write(self):
        pass


class Disk:  # Disk类也有两个与文件类型同名的方法:read和write
    def read(self):
        pass

    def write(self):
        pass
上一篇:Java学习总结--065 Spring下IOC创建对象的方式


下一篇:python-类的多态