Python3 从零单排19_组合&多态
组合 :对象1的属性是对象2,对象1就拥有了对象2的数据和函数属性,这就是组合。
# A类型和B类型没有共性,不可以继承,但是A有B的特性,比如A是人,B是家,A和B没有继承关系,但是人有家,A有B的关系,那么就可以把B的属性都给A用 class people: def __init__(self,name,age): self.name = name self.age = age def say_hi(self): print("hi my name is %s"%self.name) class home: def __init__(self,adress,area,height): self.adress = adress self.area = area self.heaight = height def home_info(self): print("地址:%s,面积:%s"%(self.adress,self.area)) xg = people("晓钢",18) hourse = home("地球",1000,10) xg.hourse = hourse xg.hourse.home_info() #地址:地球,面积:1000
抽象类:抽取一些类的共性作为一个类,比如水果类,人类。抽象类能被继承,但是不能被实例化。
当函数属性用装饰器abc.abstractmethod装饰的时候,子类必须按照抽象类的定义实现这个固定的函数属性,否则报错。
import abc #需要用到abc这个模块来定义抽象类 class animal(metaclass=abc.ABCMeta): @abc.abstractmethod #abc.abstractmethod 装饰后,该类的所有子类必须含有该方法才不会报错 def run(self): print("people is running!") def sleep(self): pass class people(animal): def run(self): #必须定义run方法才可以,否则报错 pass
多态:同一类事物的多种形态
import abc class Animal(metaclass=abc.ABCMeta): #同一类事物:动物 @abc.abstractmethod def talk(self): # animal的所有子类都必须实现talk方法,否则报错 pass class People(Animal): #动物的形态之一:人 def talk(self): print('say hello') class Dog(Animal): #动物的形态之二:狗 def talk(self): print('say wangwang') class Pig(Animal): #动物的形态之三:猪 def talk(self): print('say aoao') class Cat(Animal): #动物的形态之三:猫 def talk(self): print('say miamiao') #多态性:指的是可以在不考虑对象的类型的情况下而直接使用对象方法 从而扩展性高 peo1=People() dog1=Dog() pig1=Pig() cat1=Cat() # peo1.talk() # dog1.talk() # pig1.talk() def func(animal): animal.talk() func(peo1) func(pig1) func(dog1) func(cat1)
鸭子类型 不同类定义的函数或者数据属性名字相同,不同对象在调用这些属性时,看上去都是一样的属性,实现功能也一样,但内部代码逻辑并不一样。
class Disk: def read(self): print('disk read') def write(self): print('disk write') class Text: def read(self): print('text read') def write(self): print('text write') # f=open(...) # f.read() # f.write() disk=Disk() text=Text() disk.read() disk.write() text.read() text.write()
序列类型是典型的鸭子类型:列表list,元祖tuple,字符串str
l=list([1,2,3]) t=tuple(('a','b')) s=str('hello') # # # print(l.__len__()) # # print(t.__len__()) # # print(s.__len__()) # # # def len(obj): # # return obj.__len__() print(len(l)) print(len(t)) print(len(s))
夕闻道不如朝闻道