面向对象之多态

print('面向对象之多态')
'''
利用组合解决代码冗余问题
1.什么是组合?
组合指的是一个对象拥有某一个属性,该属性的值是另一个类的对象
例如:
obj = Foo() ###obj是调用类产生的一个对象
obj.attr1 = Bar1()
obj.attr2 = Bar2()
obj.attr3 = Bar3()
这样我们在obj一个对象中,就可以用到 Foo ,Bar1,Bar2,Bar3四个类中的属性和功能

2.为何用组合?
为了减少类与类之间代码冗余的问题
3.如何用组合?
就像操作类的属性一样,直接增删改查,只不过这里的值是另一个类的对象


二.多态与多态性
多态:
面向对象的第二个特性
多态指的是同一种事物的多种形态,这就叫多态,
一个父类下面有多个子类继承,也就是可以理解成,这个父类有多个表现形式,也就是多态
多态性:
可以在不用考虑独享具体类型的情况下面直接使用对象

优点:归一化,简化对象的使用

'''

import abc
###下面这个父类叫做抽象基类
##抽象积累:但凡继承该类的子类都必须实现speak 和run 而名字也必须相同
##注意:不能是实例化抽象基类
class Animal(metaclass=abc.ABCMeta):
@abc.abstractmethod###这个是固定写法,要求该类下的子类都必须有这个相同的功能,名字相同
def speak(self):
pass

@abc.abstractmethod
def run(self):
pass
###固定规范写法,要求该类下面的子类 都必须要有@abc.abstractmethod装饰的功能 ,名字相同,语法规范也相同
class People(Animal):

def speak(self):
print('say hello ')
def run(self):
print('runing')

class Pig(Animal):

def speak(self):
print('哼哼哼')
def run(self):
print('runing')

class Dog(Animal):

def speak(self):
print('汪汪汪')
def run(self):
print('runing')
##现在我们实例化产生三个对象,都属于动物
obj1 = People()
obj2 = Pig()
obj3 = Dog()

###现在我们只需要知道这三个对象都是动物,那么我们就可以调用run 和speak 等相关功能了
obj1.run()
obj2.run()
obj3.run()
obj1.speak()
obj2.speak()
obj3.speak()


##我们觉得像上面那样调用太Low了 于是我们自己定义一个函数,直接将对象传进去,自动调用
##相关的功能,这样就简单多了
def run(obj):
obj.run()
run(obj1)
run(obj2)
run(obj3)

def jiao(obj):
obj.speak()

jiao(obj1)
jiao(obj2)
jiao(obj3)

##Linux:一切皆文件
###python 崇尚鸭子类型:其实也不需要每个类硬性的去继承同一个类,继承一个父类
##只要他们定义了相同的功能与属性,那么我们就可以直接用
##也就是将其做得像一个鸭子,然后我们就可以直接拿他当做鸭子
##只要长得像鸭子,具备和鸭子相同的功能嘎嘎叫,那么我们叫将其称为鸭子

posted @ 2019-05-22 22:56  同济小孙  阅读(388)  评论(0编辑  收藏  举报