0%
内容概要
内容详细
多态与多态性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| 多态指的是一类事务有多种形态,比如动物有多种形态:猫、狗、猪
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()
|
1 2 3 4 5 6 7 8 9 10 11
| 例如: cat、dog、pig都是动物,但凡是动物肯定有talk方法, 于是我们可以不用考虑它们三者具体是什么类型的动物,而直接使用talk方法 >>> cat.talk() 喵喵喵 >>> dog.talk() 汪汪汪 >>> pig.talk() 哼哼哼
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| 更进一步,我们可以定义一个统一的接口来使用
>>> def Talk(animal): ... animal.talk() ... >>> Talk(cat) 喵喵喵 >>> Talk(dog) 汪汪汪 >>> Talk(pig) 哼哼哼
python中一切皆对象,本身就支持多态性
s.__len__() l.__len__() t.__len__()
len(s) len(l) len(t)
|
1 2 3 4 5 6 7 8 9 10 11 12 13
| 多态性的好处在于增强了程序的灵活性和可扩展性
例如: 通过继承Animal类创建了一个新的类,实例化得到的对象obj,可以使用相同的方式去使用obj.talk() >>> class Wolf(Animal): ... def talk(self): ... print('嗷...') ... >>> wolf=Wolf() >>> wolf.talk() 嗷...
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| 综上所述,可知: '多态性的本质在于不同的类中定义有相同的方法名,这样我们就可以不考虑类,而统一用一种方法去使用对象,可以通过在父类中引入抽象类的概念来硬性限制子类必须有某些方法名' import abc
class Animal(metaclass=abc.ABCMeta): @abc.abstractmethod def talk(self): pass
class Cat(Animal): def talk(self): pass
cat=Cat()
|
鸭子类型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| 其实我们完全可以不依赖继承,只需要制造出外观和行为相同的对象,同样可以实现不考虑对象类型而使用对象,这正是python崇尚的'鸭子类型' 鸭子类型:如果看起来像、叫声像且走起路来也像鸭子,那么它就是鸭子 '比起继承的方式,鸭子类型在某种程度上实现了程序的松耦合度'
例如:
class Txt: def read(self): pass def write(self): pass
class Disk: def read(self): pass def write(self): pass
|