''' 1.什么是多态? 多态指的是同一类型的事物,不同的表现形式。 2.多态的目的: 多态 也称为多态性,目的是为了在不知道对象的具体类型的情况下,同一调用属性或方法的规范。 继承是实现多态的方法之一。 - 先抽象,再继承 父类:定制一套统一的规范 子类:遵循父类统一的规范。 注意:再python中不会强制限制子类必须遵循父类的规范。(要引入抽象类) '''
class Animal: def eat(self): pass def bark(self): pass class Tiger(Animal): def eat(self): print(self.__class__.__name__, 'is eating something') def bark(self): print(self.__class__.__name__, 'is barking...') class Cat(Animal): def eat(self): print(self.__class__.__name__, 'is eating something') def bark(self): print(self.__class__.__name__, 'is barking...') class Lion(Animal): def eat(self): print(self.__class__.__name__, 'is eating something') def bark(self): print(self.__class__.__name__, 'is barking...') animal1 = Tiger() animal2 = Cat() animal3 = Lion() animal1.eat() animal2.eat() animal3.eat()
''' 抽象类 python内置模块abc模块中,有一个抽象类的装饰器 - 在父类的方法中,被@abc.abstractmethod装饰的方法,在子类中必须重写,否则会报错. 注意:python中不推荐使用抽象类 '''
import abc class Animal(metaclass=abc.ABCMeta): @abc.abstractmethod def eat(self): pass def bark(self): pass class Dog(Animal): def eat(self): pass def bark(self): pass animal1 = Dog() # 在本例中,Dog类必须重写eat()方法eat(可以有参数,也可无参数) # 也就是说必须有eat这个函数名
''' 1.什么是鸭子类型? 不同的对象,只要长得像鸭子,叫声像鸭子,那么就可以当作是鸭子. 鸭子类型是多态的表现形式之一. 2.为什么要有鸭子类型? 不同对象,先抽象出相同类型的方法,给他们定制一套统一的规范. 所有的类,在定义时都按照统一的规范编写. 如python中内置的类.str list tuple等都是鸭子类型. 多态的三种表现形式: - 继承父类 - 继承抽象类 - 鸭子类型:耦合度低,程序的可扩展性强 注意:在python中,强烈推荐使用鸭子类型 '''
# 满足鸭子类型的类可使用共同的方法 str1 = 'abc' list1 = ['a', 'b', 'c'] tuple1 = (1, 2, 3, 4) str1.__len__() list1.__len__() tuple1.__len__() len(str1) len(list1) len(tuple1)
class Tiger: def eat(self): print(self.__class__.__name__, 'is eating something') def bark(self): print(self.__class__.__name__, 'is barking...') class Cat: def eat(self): print(self.__class__.__name__, 'is eating something') def bark(self): print(self.__class__.__name__, 'is barking...') class Lion: def eat(self): print(self.__class__.__name__, 'is eating something') def bark(self): print(self.__class__.__name__, 'is barking...') animal1 = Lion() animal2 = Lion() animal3 = Lion() # 传入的对象中,只要实现了eat()方法就可以调用. def EAT(Animal): Animal.eat() EAT(animal1)