'''
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)